diff options
author | Andrew Duggan <aduggan@synaptics.com> | 2017-10-17 21:37:36 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2017-10-19 04:03:50 -0400 |
commit | ef14a4bf0910d06c7e202552914028d4956809cb (patch) | |
tree | 168d34355b77bdf9cedc918e7fbd2ffd4a28e18d | |
parent | 1fc26792b6e3bb270313063a33b6e5ffd315440b (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.c | 13 |
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) | |||
368 | static int rmi_raw_event(struct hid_device *hdev, | 368 | static 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 | } |