diff options
author | Moritz Fischer <mdf@kernel.org> | 2019-09-03 19:35:07 -0700 |
---|---|---|
committer | Moritz Fischer <mdf@kernel.org> | 2019-09-03 19:35:07 -0700 |
commit | af9ca4b0bd0502bb134f18d394a613be371d2352 (patch) | |
tree | 37b1159d4456e223981dddde4795f2061c83d14c /drivers/hid/usbhid/hiddev.c | |
parent | cbb4a74478e9eef0f8ef437e95ef7645008988f7 (diff) | |
parent | 99097a214b0c15f7595ac8f2788662f3941c1992 (diff) | |
download | kernel_replicant_linux-af9ca4b0bd0502bb134f18d394a613be371d2352.tar.gz kernel_replicant_linux-af9ca4b0bd0502bb134f18d394a613be371d2352.tar.bz2 kernel_replicant_linux-af9ca4b0bd0502bb134f18d394a613be371d2352.zip |
Merge branch 'char-misc-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc into fpga-dfl-for-5.4
Diffstat (limited to 'drivers/hid/usbhid/hiddev.c')
-rw-r--r-- | drivers/hid/usbhid/hiddev.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c index 55b72573066b..4e11cc6fc34b 100644 --- a/drivers/hid/usbhid/hiddev.c +++ b/drivers/hid/usbhid/hiddev.c @@ -284,6 +284,14 @@ static int hiddev_open(struct inode *inode, struct file *file) spin_unlock_irq(&list->hiddev->list_lock); mutex_lock(&hiddev->existancelock); + /* + * recheck exist with existance lock held to + * avoid opening a disconnected device + */ + if (!list->hiddev->exist) { + res = -ENODEV; + goto bail_unlock; + } if (!list->hiddev->open++) if (list->hiddev->exist) { struct hid_device *hid = hiddev->hid; @@ -300,6 +308,10 @@ bail_normal_power: hid_hw_power(hid, PM_HINT_NORMAL); bail_unlock: mutex_unlock(&hiddev->existancelock); + + spin_lock_irq(&list->hiddev->list_lock); + list_del(&list->node); + spin_unlock_irq(&list->hiddev->list_lock); bail: file->private_data = NULL; vfree(list); |