From dd289fb0c9cb7f3b2f3ad37509d08591180aa60d Mon Sep 17 00:00:00 2001 From: Vinayak Pane Date: Fri, 2 May 2014 16:21:10 -0700 Subject: [PATCH] HID: usbhid: add safety check at _report Add device disconnect check in usbhid_get_raw_report() Bug 200000762 Change-Id: Ia56a5ba746ee197a0be967f4cb09e38e44be8a8f Signed-off-by: Vinayak Pane Reviewed-on: http://git-master/r/404650 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Tao Xie GVS: Gerrit_Virtual_Submit Reviewed-by: Thomas Cherry --- drivers/hid/usbhid/hid-core.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index 006267f9ec62f8..714e278eca424e 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c @@ -908,12 +908,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) {