OSDN Git Service

staging: vme_user: switch to returning -EFAULT on __copy_*_user errors
authorDmitry Kalinkin <dmitry.kalinkin@gmail.com>
Fri, 26 Jun 2015 20:39:41 +0000 (23:39 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 15 Jul 2015 05:50:15 +0000 (22:50 -0700)
Signed-off-by: Dmitry Kalinkin <dmitry.kalinkin@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/vme/devices/vme_user.c

index a2345db..ef876a4 100644 (file)
@@ -123,7 +123,6 @@ struct vme_user_vma_priv {
 static ssize_t resource_to_user(int minor, char __user *buf, size_t count,
                                loff_t *ppos)
 {
-       ssize_t retval;
        ssize_t copied = 0;
 
        if (count > image[minor].size_buf)
@@ -135,13 +134,8 @@ static ssize_t resource_to_user(int minor, char __user *buf, size_t count,
        if (copied < 0)
                return (int)copied;
 
-       retval = __copy_to_user(buf, image[minor].kern_buf,
-                               (unsigned long)copied);
-       if (retval != 0) {
-               copied = (copied - retval);
-               pr_info("User copy failed\n");
-               return -EINVAL;
-       }
+       if (__copy_to_user(buf, image[minor].kern_buf, (unsigned long)copied))
+               return -EFAULT;
 
        return copied;
 }
@@ -149,21 +143,16 @@ static ssize_t resource_to_user(int minor, char __user *buf, size_t count,
 static ssize_t resource_from_user(unsigned int minor, const char __user *buf,
                                  size_t count, loff_t *ppos)
 {
-       ssize_t retval;
        ssize_t copied = 0;
 
        if (count > image[minor].size_buf)
                count = image[minor].size_buf;
 
-       retval = __copy_from_user(image[minor].kern_buf, buf,
-                                 (unsigned long)count);
-       if (retval != 0)
-               copied = (copied - retval);
-       else
-               copied = count;
+       if (__copy_from_user(image[minor].kern_buf, buf, (unsigned long)count))
+               return -EFAULT;
 
        copied = vme_master_write(image[minor].resource, image[minor].kern_buf,
-                                 copied, *ppos);
+                                 count, *ppos);
 
        return copied;
 }
@@ -172,38 +161,24 @@ static ssize_t buffer_to_user(unsigned int minor, char __user *buf,
                              size_t count, loff_t *ppos)
 {
        void *image_ptr;
-       ssize_t retval;
 
        image_ptr = image[minor].kern_buf + *ppos;
+       if (__copy_to_user(buf, image_ptr, (unsigned long)count))
+               return -EFAULT;
 
-       retval = __copy_to_user(buf, image_ptr, (unsigned long)count);
-       if (retval != 0) {
-               retval = (count - retval);
-               pr_warn("Partial copy to userspace\n");
-       } else
-               retval = count;
-
-       /* Return number of bytes successfully read */
-       return retval;
+       return count;
 }
 
 static ssize_t buffer_from_user(unsigned int minor, const char __user *buf,
                                size_t count, loff_t *ppos)
 {
        void *image_ptr;
-       size_t retval;
 
        image_ptr = image[minor].kern_buf + *ppos;
+       if (__copy_from_user(image_ptr, buf, (unsigned long)count))
+               return -EFAULT;
 
-       retval = __copy_from_user(image_ptr, buf, (unsigned long)count);
-       if (retval != 0) {
-               retval = (count - retval);
-               pr_warn("Partial copy to userspace\n");
-       } else
-               retval = count;
-
-       /* Return number of bytes successfully read */
-       return retval;
+       return count;
 }
 
 static ssize_t vme_user_read(struct file *file, char __user *buf, size_t count,