提交 dfe5c7b7 编写于 作者: J Julia Lawall 提交者: Jiri Kosina

HID: roccat: introduce missing kfree

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: NJulia Lawall <julia@diku.dk>
Signed-off-by: NJiri Kosina <jkosina@suse.cz>
上级 33ccbc32
...@@ -168,7 +168,7 @@ static int roccat_open(struct inode *inode, struct file *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", printk(KERN_EMERG "roccat device with minor %d doesn't exist\n",
minor); minor);
error = -ENODEV; error = -ENODEV;
goto exit_unlock; goto exit_err;
} }
if (!device->open++) { if (!device->open++) {
...@@ -178,7 +178,7 @@ static int roccat_open(struct inode *inode, struct file *file) ...@@ -178,7 +178,7 @@ static int roccat_open(struct inode *inode, struct file *file)
PM_HINT_FULLON); PM_HINT_FULLON);
if (error < 0) { if (error < 0) {
--device->open; --device->open;
goto exit_unlock; goto exit_err;
} }
} }
error = device->hid->ll_driver->open(device->hid); error = device->hid->ll_driver->open(device->hid);
...@@ -187,7 +187,7 @@ static int roccat_open(struct inode *inode, struct file *file) ...@@ -187,7 +187,7 @@ static int roccat_open(struct inode *inode, struct file *file)
device->hid->ll_driver->power(device->hid, device->hid->ll_driver->power(device->hid,
PM_HINT_NORMAL); PM_HINT_NORMAL);
--device->open; --device->open;
goto exit_unlock; goto exit_err;
} }
} }
...@@ -202,6 +202,9 @@ static int roccat_open(struct inode *inode, struct file *file) ...@@ -202,6 +202,9 @@ static int roccat_open(struct inode *inode, struct file *file)
mutex_unlock(&device->readers_lock); mutex_unlock(&device->readers_lock);
mutex_unlock(&devices_lock); mutex_unlock(&devices_lock);
return error; return error;
exit_err:
kfree(reader);
goto exit_unlock;
} }
static int roccat_release(struct inode *inode, struct file *file) static int roccat_release(struct inode *inode, struct file *file)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册