Staging: rtl8712: Use memdup_user() instead of copy_from_user()
authorCristina Opriceana <cristina.opriceana@gmail.com>
Sat, 28 Mar 2015 00:57:34 +0000 (02:57 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 1 Apr 2015 15:26:58 +0000 (17:26 +0200)
Use memdup_user() to avoid its duplicated implementation and simplify
code. memdup_user() uses GFP_KERNEL instead of GFP_ATOMIC,
which is valid because copy_from_user() might sleep and it's useless
to make the allocation atomic. Found with coccinelle.

Signed-off-by: Cristina Opriceana <cristina.opriceana@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/rtl8712/rtl871x_ioctl_linux.c

index 81f39c31594775be5e83097a9a4a939c9d498e94..c39d031c4aa65742170a6adb8e11d07632d36cb3 100644 (file)
@@ -1912,13 +1912,9 @@ static int r871x_mp_ioctl_hdl(struct net_device *dev,
        bset = (u8)(p->flags & 0xFFFF);
        len = p->length;
        pparmbuf = NULL;
-       pparmbuf = kmalloc(len, GFP_ATOMIC);
-       if (pparmbuf == NULL) {
-               ret = -ENOMEM;
-               goto _r871x_mp_ioctl_hdl_exit;
-       }
-       if (copy_from_user(pparmbuf, p->pointer, len)) {
-               ret = -EFAULT;
+       pparmbuf = memdup_user(p->pointer, len);
+       if (IS_ERR(pparmbuf)) {
+               ret = PTR_ERR(pparmbuf);
                goto _r871x_mp_ioctl_hdl_exit;
        }
        poidparam = (struct mp_ioctl_param *)pparmbuf;