diff options
author | Alexey Khoroshilov <khoroshilov@ispras.ru> | 2013-03-27 09:08:46 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2013-03-28 12:10:25 -0400 |
commit | 193d01532a730a53cbc74462799dbc43968b97fd (patch) | |
tree | 917477d5227813f210a84f5f9eea124507dc975b /drivers | |
parent | 607f25e56ee0a31e451f6bd8a7109fa1f5dcbe29 (diff) |
drbd: add module_put() on error path in drbd_proc_open()
If single_open() fails in drbd_proc_open(), module refcount is left incremented.
The patch adds module_put() on the error path.
Found by Linux Driver Verification project (linuxtesting.org).
Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru>
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/block/drbd/drbd_proc.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/block/drbd/drbd_proc.c b/drivers/block/drbd/drbd_proc.c index 56672a61eb94..30fe0a57f5a0 100644 --- a/drivers/block/drbd/drbd_proc.c +++ b/drivers/block/drbd/drbd_proc.c | |||
@@ -313,8 +313,14 @@ static int drbd_seq_show(struct seq_file *seq, void *v) | |||
313 | 313 | ||
314 | static int drbd_proc_open(struct inode *inode, struct file *file) | 314 | static int drbd_proc_open(struct inode *inode, struct file *file) |
315 | { | 315 | { |
316 | if (try_module_get(THIS_MODULE)) | 316 | int err; |
317 | return single_open(file, drbd_seq_show, PDE(inode)->data); | 317 | |
318 | if (try_module_get(THIS_MODULE)) { | ||
319 | err = single_open(file, drbd_seq_show, PDE(inode)->data); | ||
320 | if (err) | ||
321 | module_put(THIS_MODULE); | ||
322 | return err; | ||
323 | } | ||
318 | return -ENODEV; | 324 | return -ENODEV; |
319 | } | 325 | } |
320 | 326 | ||