diff mbox series

HID: logitech-hidpp: Guard FF init code against non-USB devices

Message ID 20221215154416.111704-1-hadess@hadess.net (mailing list archive)
State Mainlined
Commit 0e13e7b448005612972eae36c0f698c21d1e2f8a
Delegated to: Jiri Kosina
Headers show
Series HID: logitech-hidpp: Guard FF init code against non-USB devices | expand

Commit Message

Bastien Nocera Dec. 15, 2022, 3:44 p.m. UTC
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.

Reported-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Bastien Nocera <hadess@hadess.net>
---
 drivers/hid/hid-logitech-hidpp.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

Comments

Benjamin Tissoires Dec. 19, 2022, 2:06 p.m. UTC | #1
On Thu, Dec 15, 2022 at 4:44 PM Bastien Nocera <hadess@hadess.net> wrote:
>
> 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.
>
> Reported-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
> Signed-off-by: Bastien Nocera <hadess@hadess.net>
> ---

I have added cc: stable, and applied to for-6.2/upstream-fixes

Thanks,
Benjamin
diff mbox series

Patch

diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c
index 7075c887ec50..08ad19097e9e 100644
--- a/drivers/hid/hid-logitech-hidpp.c
+++ b/drivers/hid/hid-logitech-hidpp.c
@@ -2746,12 +2746,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;
@@ -2765,6 +2770,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 */