Re: [PATCH 1/1] HID: hidraw, fix window in hidraw_release

From: Jiri Slaby
Date: Tue Oct 19 2010 - 05:28:24 EST


On 10/19/2010 11:24 AM, Jiri Slaby wrote:
> There is a window between hidraw_table check and its dereference.
> In that window, the device may be unplugged and removed form the
> system and we will then dereference NULL.
>
> Lock that place properly so that either we get NULL and jump out or we
> can work with real pointer.
>
> Signed-off-by: Jiri Slaby <jslaby@xxxxxxx>
> ---
> drivers/hid/hidraw.c | 14 ++++++++++----
> 1 files changed, 10 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c
> index 925992f..6d81be3 100644
> --- a/drivers/hid/hidraw.c
> +++ b/drivers/hid/hidraw.c
> @@ -218,9 +218,13 @@ static int hidraw_release(struct inode * inode, struct file * file)
> unsigned int minor = iminor(inode);
> struct hidraw *dev;
> struct hidraw_list *list = file->private_data;
> + int ret;
>
> - if (!hidraw_table[minor])
> - return -ENODEV;
> + mutex_lock(&minors_lock);
> + if (!hidraw_table[minor]) {
> + ret = -ENODEV;
> + goto unlock;
> + }
>
> list_del(&list->node);
> dev = hidraw_table[minor];
> @@ -233,10 +237,12 @@ static int hidraw_release(struct inode * inode, struct file * file)
> kfree(list->hidraw);
> }
> }
> -
> + ret = 0;
> +unlock:
> + mutex_unlock(&minors_lock);
> kfree(list);

Actually the kfree cannot be here. The first process to exit would free
it and the others will try to free it again.

Was it supposed to leak memory in the !hidraw_table[minor] case?

regards,
--
js
suse labs
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/