diff options
author | Antonio Ospite <ospite@studenti.unina.it> | 2010-10-05 11:20:16 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2010-10-06 05:30:31 -0400 |
commit | d20d5ffab92f00188f360c44c791a5ffb988247c (patch) | |
tree | 26436afefabbd123e4c7362f9734f25a16d02922 | |
parent | a850ea30374ebed32a0724742601861853fde869 (diff) |
HID: hidraw, fix a NULL pointer dereference in hidraw_ioctl
BUG: unable to handle kernel NULL pointer dereference at 0000000000000028
IP: [<ffffffffa02c66b4>] hidraw_ioctl+0xfc/0x32c [hid]
[...]
This is reproducible by disconnecting the device while userspace does
ioctl in a loop and doesn't check return values in order to exit the
loop.
Signed-off-by: Antonio Ospite <ospite@studenti.unina.it>
Cc: stable@kernel.org
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r-- | drivers/hid/hidraw.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c index 47d70c523d9..9eaf6ae5f97 100644 --- a/drivers/hid/hidraw.c +++ b/drivers/hid/hidraw.c | |||
@@ -244,6 +244,10 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd, | |||
244 | 244 | ||
245 | mutex_lock(&minors_lock); | 245 | mutex_lock(&minors_lock); |
246 | dev = hidraw_table[minor]; | 246 | dev = hidraw_table[minor]; |
247 | if (!dev) { | ||
248 | ret = -ENODEV; | ||
249 | goto out; | ||
250 | } | ||
247 | 251 | ||
248 | switch (cmd) { | 252 | switch (cmd) { |
249 | case HIDIOCGRDESCSIZE: | 253 | case HIDIOCGRDESCSIZE: |
@@ -317,6 +321,7 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd, | |||
317 | 321 | ||
318 | ret = -ENOTTY; | 322 | ret = -ENOTTY; |
319 | } | 323 | } |
324 | out: | ||
320 | mutex_unlock(&minors_lock); | 325 | mutex_unlock(&minors_lock); |
321 | return ret; | 326 | return ret; |
322 | } | 327 | } |