| From e0feb73428b69322dd5caae90b0207de369b5575 Mon Sep 17 00:00:00 2001 |
| From: Oliver Neukum <oneukum@suse.com> |
| Date: Thu, 9 May 2019 11:30:59 +0200 |
| Subject: USB: rio500: fix memory leak in close after disconnect |
| |
| From: Oliver Neukum <oneukum@suse.com> |
| |
| commit e0feb73428b69322dd5caae90b0207de369b5575 upstream. |
| |
| If a disconnected device is closed, rio_close() must free |
| the buffers. |
| |
| Signed-off-by: Oliver Neukum <oneukum@suse.com> |
| Cc: stable <stable@vger.kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/misc/rio500.c | 17 +++++++++++++++-- |
| 1 file changed, 15 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/usb/misc/rio500.c |
| +++ b/drivers/usb/misc/rio500.c |
| @@ -86,9 +86,22 @@ static int close_rio(struct inode *inode |
| { |
| struct rio_usb_data *rio = &rio_instance; |
| |
| - rio->isopen = 0; |
| + /* against disconnect() */ |
| + mutex_lock(&rio500_mutex); |
| + mutex_lock(&(rio->lock)); |
| |
| - dev_info(&rio->rio_dev->dev, "Rio closed.\n"); |
| + rio->isopen = 0; |
| + if (!rio->present) { |
| + /* cleanup has been delayed */ |
| + kfree(rio->ibuf); |
| + kfree(rio->obuf); |
| + rio->ibuf = NULL; |
| + rio->obuf = NULL; |
| + } else { |
| + dev_info(&rio->rio_dev->dev, "Rio closed.\n"); |
| + } |
| + mutex_unlock(&(rio->lock)); |
| + mutex_unlock(&rio500_mutex); |
| return 0; |
| } |
| |