diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-12-24 00:12:09 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2016-01-04 10:27:50 -0500 |
commit | e4e85bb091d13afef7b1a10b4bd209b442be8863 (patch) | |
tree | d24699ee217788ae93571a97689b37116c353f2e /drivers/block/cciss.c | |
parent | f0fc86966253ad244f53841e3d8db2cf9f862019 (diff) | |
download | linux-stable-e4e85bb091d13afef7b1a10b4bd209b442be8863.tar.gz linux-stable-e4e85bb091d13afef7b1a10b4bd209b442be8863.tar.bz2 linux-stable-e4e85bb091d13afef7b1a10b4bd209b442be8863.zip |
cciss: switch to memdup_user_nul()
all we do to buffer is strncmp()...
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'drivers/block/cciss.c')
-rw-r--r-- | drivers/block/cciss.c | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 0422c47261c3..b38bd06d564c 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c @@ -514,14 +514,9 @@ cciss_proc_write(struct file *file, const char __user *buf, if (!buf || length > PAGE_SIZE - 1) return -EINVAL; - buffer = (char *)__get_free_page(GFP_KERNEL); - if (!buffer) - return -ENOMEM; - - err = -EFAULT; - if (copy_from_user(buffer, buf, length)) - goto out; - buffer[length] = '\0'; + buffer = memdup_user_nul(buf, length); + if (IS_ERR(buffer)) + return PTR_ERR(buffer); #ifdef CONFIG_CISS_SCSI_TAPE if (strncmp(ENGAGE_SCSI, buffer, sizeof ENGAGE_SCSI - 1) == 0) { @@ -537,8 +532,7 @@ cciss_proc_write(struct file *file, const char __user *buf, /* might be nice to have "disengage" too, but it's not safely possible. (only 1 module use count, lock issues.) */ -out: - free_page((unsigned long)buffer); + kfree(buffer); return err; } |