HID: logitech-hidpp: Guard FF init code against non-USB devices
authorBastien Nocera <hadess@hadess.net>
Thu, 15 Dec 2022 15:44:16 +0000 (16:44 +0100)
committerBenjamin Tissoires <benjamin.tissoires@redhat.com>
Mon, 19 Dec 2022 11:06:44 +0000 (12:06 +0100)
The Force Feedback code assumes that all the devices passed to it will
be USB devices, but that might not be the case for emulated devices.
Guard against a crash by checking the device type before poking at USB
properties.

Cc: stable@vger.kernel.org # v5.16+
Reported-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Bastien Nocera <hadess@hadess.net>
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Link: https://lore.kernel.org/r/20221215154416.111704-1-hadess@hadess.net
drivers/hid/hid-logitech-hidpp.c

index c6e4a96..abf2c95 100644 (file)
@@ -2548,12 +2548,17 @@ static int hidpp_ff_init(struct hidpp_device *hidpp,
        struct hid_device *hid = hidpp->hid_dev;
        struct hid_input *hidinput;
        struct input_dev *dev;
-       const struct usb_device_descriptor *udesc = &(hid_to_usb_dev(hid)->descriptor);
-       const u16 bcdDevice = le16_to_cpu(udesc->bcdDevice);
+       struct usb_device_descriptor *udesc;
+       u16 bcdDevice;
        struct ff_device *ff;
        int error, j, num_slots = data->num_effects;
        u8 version;
 
+       if (!hid_is_usb(hid)) {
+               hid_err(hid, "device is not USB\n");
+               return -ENODEV;
+       }
+
        if (list_empty(&hid->inputs)) {
                hid_err(hid, "no inputs found\n");
                return -ENODEV;
@@ -2567,6 +2572,8 @@ static int hidpp_ff_init(struct hidpp_device *hidpp,
        }
 
        /* Get firmware release */
+       udesc = &(hid_to_usb_dev(hid)->descriptor);
+       bcdDevice = le16_to_cpu(udesc->bcdDevice);
        version = bcdDevice & 255;
 
        /* Set supported force feedback capabilities */