OSDN Git Service

esas2r: don't open-code memdup_user()
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 30 Mar 2017 16:27:21 +0000 (12:27 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 6 Apr 2017 06:11:00 +0000 (02:11 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
drivers/scsi/esas2r/esas2r_ioctl.c

index b35ed38..2d4b7f0 100644 (file)
@@ -1289,32 +1289,13 @@ int esas2r_ioctl_handler(void *hostdata, int cmd, void __user *arg)
            || (cmd > EXPRESS_IOCTL_MAX))
                return -ENOTSUPP;
 
-       if (!access_ok(VERIFY_WRITE, arg, sizeof(struct atto_express_ioctl))) {
+       ioctl = memdup_user(arg, sizeof(struct atto_express_ioctl));
+       if (IS_ERR(ioctl)) {
                esas2r_log(ESAS2R_LOG_WARN,
                           "ioctl_handler access_ok failed for cmd %d, "
                           "address %p", cmd,
                           arg);
-               return -EFAULT;
-       }
-
-       /* allocate a kernel memory buffer for the IOCTL data */
-       ioctl = kzalloc(sizeof(struct atto_express_ioctl), GFP_KERNEL);
-       if (ioctl == NULL) {
-               esas2r_log(ESAS2R_LOG_WARN,
-                          "ioctl_handler kzalloc failed for %zu bytes",
-                          sizeof(struct atto_express_ioctl));
-               return -ENOMEM;
-       }
-
-       err = __copy_from_user(ioctl, arg, sizeof(struct atto_express_ioctl));
-       if (err != 0) {
-               esas2r_log(ESAS2R_LOG_WARN,
-                          "copy_from_user didn't copy everything (err %d, cmd %d)",
-                          err,
-                          cmd);
-               kfree(ioctl);
-
-               return -EFAULT;
+               return PTR_ERR(ioctl);
        }
 
        /* verify the signature */