diff options
author | Vinayak Pane <vpane@nvidia.com> | 2014-07-03 19:03:49 -0700 |
---|---|---|
committer | Mandar Padmawar <mpadmawar@nvidia.com> | 2014-07-10 02:05:34 -0700 |
commit | 8f1686f1a8f25b3f2b86b6d809755d1a0fdeb277 (patch) | |
tree | 111c71e6f2ab84979254d8f7b7bc7970ded6ecfb | |
parent | 74b461d49c580fec3b534be859b1fa07d1889f15 (diff) |
HID: usbhid: protect hid disconnect flag
Acquire spin_lock before checking disconnect flag of hid.
Also add USB interface null check at get_raw_report.
Bug 200018305
Change-Id: I7255fa641cabf0866dd0d1f2fdab460ec82eca70
Signed-off-by: Vinayak Pane <vpane@nvidia.com>
Reviewed-on: http://git-master/r/434584
(cherry picked from commit df6b2b50b8e0f4db0609bd5c3388225243038778)
Reviewed-on: http://git-master/r/435733
GVS: Gerrit_Virtual_Submit
Reviewed-by: Anshul Jain (SW) <anshulj@nvidia.com>
Tested-by: Anshul Jain (SW) <anshulj@nvidia.com>
-rw-r--r-- | drivers/hid/usbhid/hid-core.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index ec70dd25ba59..08232e07f1e1 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c @@ -907,13 +907,20 @@ static int usbhid_get_raw_report(struct hid_device *hid, int skipped_report_id = 0; int ret; + intf = usbhid->intf; + if (intf == NULL) { + pr_err("%s: no USB intf\n", __func__); + return -ESHUTDOWN; + } + spin_lock_irq(&usbhid->lock); if (test_bit(HID_DISCONNECTED, &usbhid->iofl)) { pr_err("hid device disconnected\n"); + spin_unlock_irq(&usbhid->lock); return -ESHUTDOWN; } + spin_unlock_irq(&usbhid->lock); dev = hid_to_usb_dev(hid); - intf = usbhid->intf; interface = intf->cur_altsetting; /* Byte 0 is the report number. Report data starts at byte 1.*/ @@ -1379,6 +1386,10 @@ static void usbhid_disconnect(struct usb_interface *intf) return; usbhid = hid->driver_data; + spin_lock_irq(&usbhid->lock); + set_bit(HID_DISCONNECTED, &usbhid->iofl); + spin_unlock_irq(&usbhid->lock); + hid_destroy_device(hid); kfree(usbhid); } |