HID: wacom: fix problems when device is not a valid USB device
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
This commit is contained in:
parent
f83baa0cb6
commit
720ac46720
|
@ -726,7 +726,7 @@ static void wacom_retrieve_hid_descriptor(struct hid_device *hdev,
|
||||||
* Skip the query for this type and modify defaults based on
|
* Skip the query for this type and modify defaults based on
|
||||||
* interface number.
|
* interface number.
|
||||||
*/
|
*/
|
||||||
if (features->type == WIRELESS) {
|
if (features->type == WIRELESS && intf) {
|
||||||
if (intf->cur_altsetting->desc.bInterfaceNumber == 0)
|
if (intf->cur_altsetting->desc.bInterfaceNumber == 0)
|
||||||
features->device_type = WACOM_DEVICETYPE_WL_MONITOR;
|
features->device_type = WACOM_DEVICETYPE_WL_MONITOR;
|
||||||
else
|
else
|
||||||
|
@ -2451,6 +2451,9 @@ static void wacom_wireless_work(struct work_struct *work)
|
||||||
|
|
||||||
wacom_destroy_battery(wacom);
|
wacom_destroy_battery(wacom);
|
||||||
|
|
||||||
|
if (!usbdev)
|
||||||
|
return;
|
||||||
|
|
||||||
/* Stylus interface */
|
/* Stylus interface */
|
||||||
hdev1 = usb_get_intfdata(usbdev->config->interface[1]);
|
hdev1 = usb_get_intfdata(usbdev->config->interface[1]);
|
||||||
wacom1 = hid_get_drvdata(hdev1);
|
wacom1 = hid_get_drvdata(hdev1);
|
||||||
|
@ -2730,8 +2733,6 @@ static void wacom_mode_change_work(struct work_struct *work)
|
||||||
static int wacom_probe(struct hid_device *hdev,
|
static int wacom_probe(struct hid_device *hdev,
|
||||||
const struct hid_device_id *id)
|
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 *wacom;
|
||||||
struct wacom_wac *wacom_wac;
|
struct wacom_wac *wacom_wac;
|
||||||
struct wacom_features *features;
|
struct wacom_features *features;
|
||||||
|
@ -2766,8 +2767,14 @@ static int wacom_probe(struct hid_device *hdev,
|
||||||
wacom_wac->hid_data.inputmode = -1;
|
wacom_wac->hid_data.inputmode = -1;
|
||||||
wacom_wac->mode_report = -1;
|
wacom_wac->mode_report = -1;
|
||||||
|
|
||||||
wacom->usbdev = dev;
|
if (hid_is_usb(hdev)) {
|
||||||
wacom->intf = intf;
|
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);
|
mutex_init(&wacom->lock);
|
||||||
INIT_DELAYED_WORK(&wacom->init_work, wacom_init_work);
|
INIT_DELAYED_WORK(&wacom->init_work, wacom_init_work);
|
||||||
INIT_WORK(&wacom->wireless_work, wacom_wireless_work);
|
INIT_WORK(&wacom->wireless_work, wacom_wireless_work);
|
||||||
|
|
Loading…
Reference in New Issue