| From a0ebf519b8a2666438d999c62995618c710573e5 Mon Sep 17 00:00:00 2001 |
| From: Johan Hovold <johan@kernel.org> |
| Date: Fri, 18 Nov 2016 14:17:31 +0200 |
| Subject: stm class: Fix device leak in open error path |
| |
| From: Johan Hovold <johan@kernel.org> |
| |
| commit a0ebf519b8a2666438d999c62995618c710573e5 upstream. |
| |
| Make sure to drop the reference taken by class_find_device() also on |
| allocation errors in open(). |
| |
| Signed-off-by: Johan Hovold <johan@kernel.org> |
| Fixes: 7bd1d4093c2f ("stm class: Introduce an abstraction for...") |
| Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/hwtracing/stm/core.c | 8 +++++--- |
| 1 file changed, 5 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/hwtracing/stm/core.c |
| +++ b/drivers/hwtracing/stm/core.c |
| @@ -361,7 +361,7 @@ static int stm_char_open(struct inode *i |
| struct stm_file *stmf; |
| struct device *dev; |
| unsigned int major = imajor(inode); |
| - int err = -ENODEV; |
| + int err = -ENOMEM; |
| |
| dev = class_find_device(&stm_class, NULL, &major, major_match); |
| if (!dev) |
| @@ -369,8 +369,9 @@ static int stm_char_open(struct inode *i |
| |
| stmf = kzalloc(sizeof(*stmf), GFP_KERNEL); |
| if (!stmf) |
| - return -ENOMEM; |
| + goto err_put_device; |
| |
| + err = -ENODEV; |
| stm_output_init(&stmf->output); |
| stmf->stm = to_stm_device(dev); |
| |
| @@ -382,9 +383,10 @@ static int stm_char_open(struct inode *i |
| return nonseekable_open(inode, file); |
| |
| err_free: |
| + kfree(stmf); |
| +err_put_device: |
| /* matches class_find_device() above */ |
| put_device(dev); |
| - kfree(stmf); |
| |
| return err; |
| } |