i2c-dev: Use memdup_user
authorThomas Meyer <thomas@m3y3r.de>
Thu, 12 Jan 2012 19:32:04 +0000 (20:32 +0100)
committerJean Delvare <khali@endymion.delvare>
Thu, 12 Jan 2012 19:32:04 +0000 (20:32 +0100)
Use memdup_user rather than duplicating its implementation.
This is a little bit restricted to reduce false positives.

The semantic patch that makes this output is available
in scripts/coccinelle/api/memdup_user.cocci.

More information about semantic patching is available at
http://coccinelle.lip6.fr/

Signed-off-by: Thomas Meyer <thomas@m3y3r.de>
Signed-off-by: Jean Delvare <khali@linux-fr.org>

drivers/i2c/i2c-dev.c

index 57a45ce..10e7f1e 100644 (file)
@@ -251,15 +251,10 @@ static noinline int i2cdev_ioctl_rdrw(struct i2c_client *client,
        if (rdwr_arg.nmsgs > I2C_RDRW_IOCTL_MAX_MSGS)
                return -EINVAL;
 
-       rdwr_pa = kmalloc(rdwr_arg.nmsgs * sizeof(struct i2c_msg), GFP_KERNEL);
-       if (!rdwr_pa)
-               return -ENOMEM;
-
-       if (copy_from_user(rdwr_pa, rdwr_arg.msgs,
-                          rdwr_arg.nmsgs * sizeof(struct i2c_msg))) {
-               kfree(rdwr_pa);
-               return -EFAULT;
-       }
+       rdwr_pa = memdup_user(rdwr_arg.msgs,
+                             rdwr_arg.nmsgs * sizeof(struct i2c_msg));
+       if (IS_ERR(rdwr_pa))
+               return PTR_ERR(rdwr_pa);
 
        data_ptrs = kmalloc(rdwr_arg.nmsgs * sizeof(u8 __user *), GFP_KERNEL);
        if (data_ptrs == NULL) {