]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: hpsa: Replace kmalloc() + copy_from_user() with memdup_user()
authorThorsten Blum <thorsten.blum@linux.dev>
Tue, 23 Sep 2025 17:15:04 +0000 (19:15 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 25 Sep 2025 01:41:24 +0000 (21:41 -0400)
Replace kmalloc() followed by copy_from_user() with memdup_user() to
improve and simplify hpsa_passthru_ioctl().

Since memdup_user() already allocates memory, use kzalloc() in the else
branch instead of manually zeroing 'buff' using memset(0).

Return early if an error occurs and remove the 'out_kfree' label.

No functional changes intended.

Signed-off-by: Thorsten Blum <thorsten.blum@linux.dev>
Acked-by: Don Brace <don.brace@microchip.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/hpsa.c

index 1f917e882ae45c59102d92ea741e18b80c0a804a..3654b12c5d5a75bebd7c41635f489aa62cd09887 100644 (file)
@@ -6402,18 +6402,14 @@ static int hpsa_passthru_ioctl(struct ctlr_info *h,
                return -EINVAL;
        }
        if (iocommand->buf_size > 0) {
-               buff = kmalloc(iocommand->buf_size, GFP_KERNEL);
-               if (buff == NULL)
-                       return -ENOMEM;
                if (iocommand->Request.Type.Direction & XFER_WRITE) {
-                       /* Copy the data into the buffer we created */
-                       if (copy_from_user(buff, iocommand->buf,
-                               iocommand->buf_size)) {
-                               rc = -EFAULT;
-                               goto out_kfree;
-                       }
+                       buff = memdup_user(iocommand->buf, iocommand->buf_size);
+                       if (IS_ERR(buff))
+                               return PTR_ERR(buff);
                } else {
-                       memset(buff, 0, iocommand->buf_size);
+                       buff = kzalloc(iocommand->buf_size, GFP_KERNEL);
+                       if (!buff)
+                               return -ENOMEM;
                }
        }
        c = cmd_alloc(h);
@@ -6473,7 +6469,6 @@ static int hpsa_passthru_ioctl(struct ctlr_info *h,
        }
 out:
        cmd_free(h, c);
-out_kfree:
        kfree(buff);
        return rc;
 }