summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVinayak Pane <vpane@nvidia.com>2014-07-03 19:03:49 -0700
committerMandar Padmawar <mpadmawar@nvidia.com>2014-07-10 02:05:34 -0700
commit8f1686f1a8f25b3f2b86b6d809755d1a0fdeb277 (patch)
tree111c71e6f2ab84979254d8f7b7bc7970ded6ecfb
parent74b461d49c580fec3b534be859b1fa07d1889f15 (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.c13
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);
}