]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
s390/sclp: Prevent release of buffer in I/O
authorPeter Oberparleiter <oberpar@linux.ibm.com>
Thu, 20 Jun 2024 12:20:27 +0000 (14:20 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 14 Aug 2024 13:34:16 +0000 (15:34 +0200)
[ Upstream commit bf365071ea92b9579d5a272679b74052a5643e35 ]

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 <hca@linux.ibm.com>
Signed-off-by: Peter Oberparleiter <oberpar@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/s390/char/sclp_sd.c

index f9e164be7568f2c877609d1a487ab1d2ff6279b6..944e75beb160c69b9c295c44636c783a23d821f0 100644 (file)
@@ -320,8 +320,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;
        }