diff options
author | Julia Lawall <julia@diku.dk> | 2011-05-26 16:25:59 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-26 17:12:37 -0700 |
commit | d98808a253f209465ed9f415c565f4c294a213b8 (patch) | |
tree | 4d60da0dc3a2ad367edbb2c3c51c352bce7da918 /drivers | |
parent | e2e77098764636456ba7092a8b3b3b34b2a8e8d8 (diff) | |
download | kernel_samsung_smdk4412-d98808a253f209465ed9f415c565f4c294a213b8.tar.gz kernel_samsung_smdk4412-d98808a253f209465ed9f415c565f4c294a213b8.tar.bz2 kernel_samsung_smdk4412-d98808a253f209465ed9f415c565f4c294a213b8.zip |
drivers/char/ppdev.c: put gotten port value
parport_find_number() calls parport_get_port() on its result, so there
should be a corresponding call to parport_put_port() before dropping the
reference. Similar code is found in the function register_device() in the
same file.
The semantic match that finds this problem is as follows:
(http://coccinelle.lip6.fr/)
// <smpl>
@exists@
local idexpression struct parport * x;
expression ra,rr;
statement S1,S2;
@@
x = parport_find_number(...)
... when != x = rr
when any
when != parport_put_port(x,...)
when != if (...) { ... parport_put_port(x,...) ...}
(
if(<+...x...+>) S1 else S2
|
if(...) { ... when != x = ra
when forall
when != parport_put_port(x,...)
*return...;
}
)
// </smpl>
Signed-off-by: Julia Lawall <julia@diku.dk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/char/ppdev.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/char/ppdev.c b/drivers/char/ppdev.c index f176dbaeb15..3fcf80ff12f 100644 --- a/drivers/char/ppdev.c +++ b/drivers/char/ppdev.c @@ -457,6 +457,7 @@ static int pp_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg) return -ENODEV; modes = port->modes; + parport_put_port(port); if (copy_to_user (argp, &modes, sizeof (modes))) { return -EFAULT; } |