]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
HID: roccat: introduce missing kfree
authorJulia Lawall <julia@diku.dk>
Tue, 1 Jun 2010 14:35:15 +0000 (16:35 +0200)
committerJiri Kosina <jkosina@suse.cz>
Wed, 2 Jun 2010 09:08:42 +0000 (11:08 +0200)
Error handling code following a kmalloc should free the allocated data.

The semantic match that finds the problem is as follows:
(http://www.emn.fr/x-info/coccinelle/)

// <smpl>
@r exists@
local idexpression x;
statement S;
expression E;
identifier f,f1,l;
position p1,p2;
expression *ptr != NULL;
@@

x@p1 = \(kmalloc\|kzalloc\|kcalloc\)(...);
...
if (x == NULL) S
<... when != x
     when != if (...) { <+...x...+> }
(
x->f1 = E
|
 (x->f1 == NULL || ...)
|
 f(...,x->f1,...)
)
...>
(
 return \(0\|<+...x...+>\|ptr\);
|
 return@p2 ...;
)

@script:python@
p1 << r.p1;
p2 << r.p2;
@@

print "* file: %s kmalloc %s return %s" % (p1[0].file,p1[0].line,p2[0].line)
// </smpl>

Signed-off-by: Julia Lawall <julia@diku.dk>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-roccat.c

index e05d48edb66f540bc2048458e5c88b20721eea8d..f6e80c7ca61e53c0f9655778306ffc3e82a28b9f 100644 (file)
@@ -168,7 +168,7 @@ static int roccat_open(struct inode *inode, struct file *file)
                printk(KERN_EMERG "roccat device with minor %d doesn't exist\n",
                                minor);
                error = -ENODEV;
-               goto exit_unlock;
+               goto exit_err;
        }
 
        if (!device->open++) {
@@ -178,7 +178,7 @@ static int roccat_open(struct inode *inode, struct file *file)
                                        PM_HINT_FULLON);
                        if (error < 0) {
                                --device->open;
-                               goto exit_unlock;
+                               goto exit_err;
                        }
                }
                error = device->hid->ll_driver->open(device->hid);
@@ -187,7 +187,7 @@ static int roccat_open(struct inode *inode, struct file *file)
                                device->hid->ll_driver->power(device->hid,
                                                PM_HINT_NORMAL);
                        --device->open;
-                       goto exit_unlock;
+                       goto exit_err;
                }
        }
 
@@ -202,6 +202,9 @@ exit_unlock:
        mutex_unlock(&device->readers_lock);
        mutex_unlock(&devices_lock);
        return error;
+exit_err:
+       kfree(reader);
+       goto exit_unlock;
 }
 
 static int roccat_release(struct inode *inode, struct file *file)