summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVinayak Pane <vpane@nvidia.com>2014-05-02 16:21:10 -0700
committerMandar Padmawar <mpadmawar@nvidia.com>2014-06-25 00:49:11 -0700
commitb9389acf42f01d52b5796b64e04e4d5d499c2974 (patch)
tree1839f70170076e7e4ae8b0f124284a4d5504a0f3
parent0c07f4b361386c6b1969f4144d46708f5a8d823a (diff)
HID: usbhid: add safety check at _report
Add device disconnect check in usbhid_get_raw_report() Bug 200000762 Change-Id: Ia56a5ba746ee197a0be967f4cb09e38e44be8a8f Reviewed-on: http://git-master/r/404650 (cherry picked from dd289fb0c9cb7f3b2f3ad37509d08591180aa60d) Signed-off-by: Jean Huang <jeanh@nvidia.com> Reviewed-on: http://git-master/r/427947 GVS: Gerrit_Virtual_Submit
-rw-r--r--drivers/hid/usbhid/hid-core.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 4bbb883a3dd2..f03401947718 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -901,12 +901,21 @@ static int usbhid_get_raw_report(struct hid_device *hid,
unsigned char report_type)
{
struct usbhid_device *usbhid = hid->driver_data;
- struct usb_device *dev = hid_to_usb_dev(hid);
- struct usb_interface *intf = usbhid->intf;
- struct usb_host_interface *interface = intf->cur_altsetting;
+ struct usb_device *dev;
+ struct usb_interface *intf;
+ struct usb_host_interface *interface;
int skipped_report_id = 0;
int ret;
+ if (test_bit(HID_DISCONNECTED, &usbhid->iofl)) {
+ pr_err("hid device disconnected\n");
+ return -ESHUTDOWN;
+ }
+
+ 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.*/
buf[0] = report_number;
if (report_number == 0x0) {