staging: comedi: use memdup_user to simplify code
authorTeodora Baluta <teobaluta@gmail.com>
Mon, 28 Oct 2013 22:09:18 +0000 (00:09 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 29 Oct 2013 15:40:53 +0000 (08:40 -0700)
Use memdup_user rather than duplicating implementation. Fix following
coccinelle warnings:

drivers/staging/comedi/comedi_fops.c:1425:5-12: WARNING opportunity for memdup_user
drivers/staging/comedi/comedi_fops.c:1553:6-13: WARNING opportunity for memdup_user

Signed-off-by: Teodora Baluta <teobaluta@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/comedi_fops.c

index 721df31..f3d59e2 100644 (file)
@@ -1421,17 +1421,11 @@ static int do_cmd_ioctl(struct comedi_device *dev,
        async->cmd = cmd;
        async->cmd.data = NULL;
        /* load channel/gain list */
-       async->cmd.chanlist =
-           kmalloc(async->cmd.chanlist_len * sizeof(int), GFP_KERNEL);
-       if (!async->cmd.chanlist) {
-               DPRINTK("allocation failed\n");
-               return -ENOMEM;
-       }
-
-       if (copy_from_user(async->cmd.chanlist, user_chanlist,
-                          async->cmd.chanlist_len * sizeof(int))) {
-               DPRINTK("fault reading chanlist\n");
-               ret = -EFAULT;
+       async->cmd.chanlist = memdup_user(user_chanlist,
+                                         async->cmd.chanlist_len * sizeof(int));
+       if (IS_ERR(async->cmd.chanlist)) {
+               ret = PTR_ERR(async->cmd.chanlist);
+               DPRINTK("memdup_user failed with code %d\n", ret);
                goto cleanup;
        }
 
@@ -1549,18 +1543,11 @@ static int do_cmdtest_ioctl(struct comedi_device *dev,
 
        /* load channel/gain list */
        if (cmd.chanlist) {
-               chanlist =
-                   kmalloc(cmd.chanlist_len * sizeof(int), GFP_KERNEL);
-               if (!chanlist) {
-                       DPRINTK("allocation failed\n");
-                       ret = -ENOMEM;
-                       goto cleanup;
-               }
-
-               if (copy_from_user(chanlist, user_chanlist,
-                                  cmd.chanlist_len * sizeof(int))) {
-                       DPRINTK("fault reading chanlist\n");
-                       ret = -EFAULT;
+               chanlist = memdup_user(user_chanlist,
+                                      cmd.chanlist_len * sizeof(int));
+               if (IS_ERR(chanlist)) {
+                       ret = PTR_ERR(chanlist);
+                       DPRINTK("memdup_user exited with code %d", ret);
                        goto cleanup;
                }