drivers/net/usb: Use kmemdup
authorJulia Lawall <julia@diku.dk>
Sat, 15 May 2010 11:18:58 +0000 (11:18 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 18 May 2010 00:44:47 +0000 (17:44 -0700)
Use kmemdup when some other buffer is immediately copied into the
allocated region.

A simplified version of the semantic patch that makes this change is as
follows: (http://coccinelle.lip6.fr/)

// <smpl>
@@
expression from,to,size,flag;
statement S;
@@

-  to = \(kmalloc\|kzalloc\)(size,flag);
+  to = kmemdup(from,size,flag);
   if (to==NULL || ...) S
-  memcpy(to, from, size);
// </smpl>

Signed-off-by: Julia Lawall <julia@diku.dk>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/usb/pegasus.c

index 1cd17d2..974d17f 100644 (file)
@@ -203,13 +203,12 @@ static int set_registers(pegasus_t * pegasus, __u16 indx, __u16 size,
        char *buffer;
        DECLARE_WAITQUEUE(wait, current);
 
-       buffer = kmalloc(size, GFP_KERNEL);
+       buffer = kmemdup(data, size, GFP_KERNEL);
        if (!buffer) {
                netif_warn(pegasus, drv, pegasus->net,
                           "out of memory in %s\n", __func__);
                return -ENOMEM;
        }
-       memcpy(buffer, data, size);
 
        add_wait_queue(&pegasus->ctrl_wait, &wait);
        set_current_state(TASK_UNINTERRUPTIBLE);
@@ -255,13 +254,12 @@ static int set_register(pegasus_t * pegasus, __u16 indx, __u8 data)
        char *tmp;
        DECLARE_WAITQUEUE(wait, current);
 
-       tmp = kmalloc(1, GFP_KERNEL);
+       tmp = kmemdup(&data, 1, GFP_KERNEL);
        if (!tmp) {
                netif_warn(pegasus, drv, pegasus->net,
                           "out of memory in %s\n", __func__);
                return -ENOMEM;
        }
-       memcpy(tmp, &data, 1);
        add_wait_queue(&pegasus->ctrl_wait, &wait);
        set_current_state(TASK_UNINTERRUPTIBLE);
        while (pegasus->flags & ETH_REGS_CHANGED)