From: Peter Oberparleiter Date: Thu, 20 Jun 2024 12:20:27 +0000 (+0200) Subject: s390/sclp: Prevent release of buffer in I/O X-Git-Tag: v6.11-rc1~126^2~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bf365071ea92b9579d5a272679b74052a5643e35;p=thirdparty%2Fkernel%2Flinux.git s390/sclp: Prevent release of buffer in I/O When a task waiting for completion of a Store Data operation is interrupted, an attempt is made to halt this operation. If this attempt fails due to a hardware or firmware problem, there is a chance that the SCLP facility might store data into buffers referenced by the original operation at a later time. Handle this situation by not releasing the referenced data buffers if the halt attempt fails. For current use cases, this might result in a leak of few pages of memory in case of a rare hardware/firmware malfunction. Reviewed-by: Heiko Carstens Signed-off-by: Peter Oberparleiter Signed-off-by: Alexander Gordeev --- diff --git a/drivers/s390/char/sclp_sd.c b/drivers/s390/char/sclp_sd.c index 5aeb7e094a1cb..322700b96207d 100644 --- a/drivers/s390/char/sclp_sd.c +++ b/drivers/s390/char/sclp_sd.c @@ -324,8 +324,14 @@ static int sclp_sd_store_data(struct sclp_sd_data *result, u8 di) &esize); if (rc) { /* Cancel running request if interrupted */ - if (rc == -ERESTARTSYS) - sclp_sd_sync(page, SD_EQ_HALT, di, 0, 0, NULL, NULL); + if (rc == -ERESTARTSYS) { + if (sclp_sd_sync(page, SD_EQ_HALT, di, 0, 0, NULL, NULL)) { + pr_warn("Could not stop Store Data request - leaking at least %zu bytes\n", + (size_t)dsize * PAGE_SIZE); + data = NULL; + asce = 0; + } + } vfree(data); goto out; }