aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Duggan <aduggan@synaptics.com>2017-10-17 21:37:36 -0400
committerJiri Kosina <jkosina@suse.cz>2017-10-19 04:03:50 -0400
commitef14a4bf0910d06c7e202552914028d4956809cb (patch)
tree168d34355b77bdf9cedc918e7fbd2ffd4a28e18d
parent1fc26792b6e3bb270313063a33b6e5ffd315440b (diff)
HID: rmi: Check that a device is a RMI device before calling RMI functions
The hid-rmi driver may handle non rmi devices on composite USB devices. Callbacks need to make sure that the current device is a RMI device before calling RMI specific functions. Most callbacks already have this check, but this patch adds checks to the remaining callbacks. Reported-by: Hendrik Langer <hendrik.langer@gmx.de> Tested-by: Hendrik Langer <hendrik.langer@gmx.de> Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Signed-off-by: Andrew Duggan <aduggan@synaptics.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r--drivers/hid/hid-rmi.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/hid/hid-rmi.c b/drivers/hid/hid-rmi.c
index ef241d66562e..0f43c4292685 100644
--- a/drivers/hid/hid-rmi.c
+++ b/drivers/hid/hid-rmi.c
@@ -368,6 +368,11 @@ static int rmi_check_sanity(struct hid_device *hdev, u8 *data, int size)
368static int rmi_raw_event(struct hid_device *hdev, 368static int rmi_raw_event(struct hid_device *hdev,
369 struct hid_report *report, u8 *data, int size) 369 struct hid_report *report, u8 *data, int size)
370{ 370{
371 struct rmi_data *hdata = hid_get_drvdata(hdev);
372
373 if (!(hdata->device_flags & RMI_DEVICE))
374 return 0;
375
371 size = rmi_check_sanity(hdev, data, size); 376 size = rmi_check_sanity(hdev, data, size);
372 if (size < 2) 377 if (size < 2)
373 return 0; 378 return 0;
@@ -713,9 +718,11 @@ static void rmi_remove(struct hid_device *hdev)
713{ 718{
714 struct rmi_data *hdata = hid_get_drvdata(hdev); 719 struct rmi_data *hdata = hid_get_drvdata(hdev);
715 720
716 clear_bit(RMI_STARTED, &hdata->flags); 721 if (hdata->device_flags & RMI_DEVICE) {
717 cancel_work_sync(&hdata->reset_work); 722 clear_bit(RMI_STARTED, &hdata->flags);
718 rmi_unregister_transport_device(&hdata->xport); 723 cancel_work_sync(&hdata->reset_work);
724 rmi_unregister_transport_device(&hdata->xport);
725 }
719 726
720 hid_hw_stop(hdev); 727 hid_hw_stop(hdev);
721} 728}