| From 720ac467204a70308bd687927ed475afb904e11b Mon Sep 17 00:00:00 2001 |
| From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Date: Wed, 1 Dec 2021 19:35:02 +0100 |
| Subject: HID: wacom: fix problems when device is not a valid USB device |
| |
| From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| commit 720ac467204a70308bd687927ed475afb904e11b upstream. |
| |
| The wacom driver accepts devices of more than just USB types, but some |
| code paths can cause problems if the device being controlled is not a |
| USB device due to a lack of checking. Add the needed checks to ensure |
| that the USB device accesses are only happening on a "real" USB device, |
| and not one on some other bus. |
| |
| Cc: Jiri Kosina <jikos@kernel.org> |
| Cc: Benjamin Tissoires <benjamin.tissoires@redhat.com> |
| Cc: linux-input@vger.kernel.org |
| Cc: stable@vger.kernel.org |
| Tested-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> |
| Link: https://lore.kernel.org/r/20211201183503.2373082-2-gregkh@linuxfoundation.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/hid/wacom_sys.c | 17 ++++++++++++----- |
| 1 file changed, 12 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/hid/wacom_sys.c |
| +++ b/drivers/hid/wacom_sys.c |
| @@ -458,7 +458,7 @@ static void wacom_retrieve_hid_descripto |
| * Skip the query for this type and modify defaults based on |
| * interface number. |
| */ |
| - if (features->type == WIRELESS) { |
| + if (features->type == WIRELESS && intf) { |
| if (intf->cur_altsetting->desc.bInterfaceNumber == 0) |
| features->device_type = WACOM_DEVICETYPE_WL_MONITOR; |
| else |
| @@ -1512,6 +1512,9 @@ static void wacom_wireless_work(struct w |
| |
| wacom_destroy_battery(wacom); |
| |
| + if (!usbdev) |
| + return; |
| + |
| /* Stylus interface */ |
| hdev1 = usb_get_intfdata(usbdev->config->interface[1]); |
| wacom1 = hid_get_drvdata(hdev1); |
| @@ -1689,8 +1692,6 @@ static void wacom_update_name(struct wac |
| static int wacom_probe(struct hid_device *hdev, |
| const struct hid_device_id *id) |
| { |
| - struct usb_interface *intf = to_usb_interface(hdev->dev.parent); |
| - struct usb_device *dev = interface_to_usbdev(intf); |
| struct wacom *wacom; |
| struct wacom_wac *wacom_wac; |
| struct wacom_features *features; |
| @@ -1733,8 +1734,14 @@ static int wacom_probe(struct hid_device |
| goto fail_type; |
| } |
| |
| - wacom->usbdev = dev; |
| - wacom->intf = intf; |
| + if (hid_is_usb(hdev)) { |
| + struct usb_interface *intf = to_usb_interface(hdev->dev.parent); |
| + struct usb_device *dev = interface_to_usbdev(intf); |
| + |
| + wacom->usbdev = dev; |
| + wacom->intf = intf; |
| + } |
| + |
| mutex_init(&wacom->lock); |
| INIT_WORK(&wacom->work, wacom_wireless_work); |
| |