diff options
author | dan.carpenter@oracle.com <dan.carpenter@oracle.com> | 2020-01-15 20:46:28 +0300 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2020-02-12 14:46:56 +0100 |
commit | 5c02c447eaeda29d3da121a2e17b97ccaf579b51 (patch) | |
tree | 02a1c1bedb8f91014706175750a496fddb508bfe /drivers/hid/usbhid/hiddev.c | |
parent | 84a4062632462c4320704fcdf8e99e89e94c0aba (diff) | |
download | lwn-5c02c447eaeda29d3da121a2e17b97ccaf579b51.tar.gz lwn-5c02c447eaeda29d3da121a2e17b97ccaf579b51.zip |
HID: hiddev: Fix race in in hiddev_disconnect()
Syzbot reports that "hiddev" is used after it's free in hiddev_disconnect().
The hiddev_disconnect() function sets "hiddev->exist = 0;" so
hiddev_release() can free it as soon as we drop the "existancelock"
lock. This patch moves the mutex_unlock(&hiddev->existancelock) until
after we have finished using it.
Reported-by: syzbot+784ccb935f9900cc7c9e@syzkaller.appspotmail.com
Fixes: 7f77897ef2b6 ("HID: hiddev: fix potential use-after-free")
Suggested-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/usbhid/hiddev.c')
-rw-r--r-- | drivers/hid/usbhid/hiddev.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c index a970b809d778..4140dea693e9 100644 --- a/drivers/hid/usbhid/hiddev.c +++ b/drivers/hid/usbhid/hiddev.c @@ -932,9 +932,9 @@ void hiddev_disconnect(struct hid_device *hid) hiddev->exist = 0; if (hiddev->open) { - mutex_unlock(&hiddev->existancelock); hid_hw_close(hiddev->hid); wake_up_interruptible(&hiddev->wait); + mutex_unlock(&hiddev->existancelock); } else { mutex_unlock(&hiddev->existancelock); kfree(hiddev); |