Commit ac01fc41 authored by Thorsten Blum's avatar Thorsten Blum Committed by Martin K. Petersen
Browse files

scsi: hpsa: Replace kmalloc() + copy_from_user() with memdup_user()



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: default avatarThorsten Blum <thorsten.blum@linux.dev>
Acked-by: default avatarDon Brace <don.brace@microchip.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent b8129659
Loading
Loading
Loading
Loading
+6 −11
Original line number Diff line number Diff line
@@ -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;
}