Commit f39dda98 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'for-linus-2023060101' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid

Pull HID fixes from Jiri Kosina:

 - Regression fix for overlong long timeouts during initialization on
   some Logitech Unifying devices (Bastien Nocera)

 - error handling and overflow fixes for Wacom driver (Denis Arefev,
   Jason Gerecke, Nikita Zhandarovich)

* tag 'for-linus-2023060101' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid:
  HID: logitech-hidpp: Handle timeout differently from busy
  HID: wacom: Add error check to wacom_parse_and_register()
  HID: google: add jewel USB id
  HID: wacom: avoid integer overflow in wacom_intuos_inout()
  HID: wacom: Check for string overflow from strscpy calls
parents ba059590 6199d23c
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -586,6 +586,8 @@ static const struct hid_device_id hammer_devices[] = {
		     USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_EEL) },
	{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
		     USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_HAMMER) },
	{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
		     USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_JEWEL) },
	{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
		     USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_MAGNEMITE) },
	{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
+1 −0
Original line number Diff line number Diff line
@@ -529,6 +529,7 @@
#define USB_DEVICE_ID_GOOGLE_MOONBALL	0x5044
#define USB_DEVICE_ID_GOOGLE_DON	0x5050
#define USB_DEVICE_ID_GOOGLE_EEL	0x5057
#define USB_DEVICE_ID_GOOGLE_JEWEL	0x5061

#define USB_VENDOR_ID_GOTOP		0x08f2
#define USB_DEVICE_ID_SUPER_Q2		0x007f
+1 −0
Original line number Diff line number Diff line
@@ -314,6 +314,7 @@ static int hidpp_send_message_sync(struct hidpp_device *hidpp,
			dbg_hid("%s:timeout waiting for response\n", __func__);
			memset(response, 0, sizeof(struct hidpp_report));
			ret = -ETIMEDOUT;
			goto exit;
		}

		if (response->report_id == REPORT_ID_HIDPP_SHORT &&
+16 −5
Original line number Diff line number Diff line
@@ -2224,7 +2224,9 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix)
		} else if (strstr(product_name, "Wacom") ||
			   strstr(product_name, "wacom") ||
			   strstr(product_name, "WACOM")) {
			strscpy(name, product_name, sizeof(name));
			if (strscpy(name, product_name, sizeof(name)) < 0) {
				hid_warn(wacom->hdev, "String overflow while assembling device name");
			}
		} else {
			snprintf(name, sizeof(name), "Wacom %s", product_name);
		}
@@ -2242,7 +2244,9 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix)
		if (name[strlen(name)-1] == ' ')
			name[strlen(name)-1] = '\0';
	} else {
		strscpy(name, features->name, sizeof(name));
		if (strscpy(name, features->name, sizeof(name)) < 0) {
			hid_warn(wacom->hdev, "String overflow while assembling device name");
		}
	}

	snprintf(wacom_wac->name, sizeof(wacom_wac->name), "%s%s",
@@ -2410,8 +2414,13 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
		goto fail_quirks;
	}

	if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR)
	if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR) {
		error = hid_hw_open(hdev);
		if (error) {
			hid_err(hdev, "hw open failed\n");
			goto fail_quirks;
		}
	}

	wacom_set_shared_values(wacom_wac);
	devres_close_group(&hdev->dev, wacom);
@@ -2500,8 +2509,10 @@ static void wacom_wireless_work(struct work_struct *work)
				goto fail;
		}

		strscpy(wacom_wac->name, wacom_wac1->name,
			sizeof(wacom_wac->name));
		if (strscpy(wacom_wac->name, wacom_wac1->name,
			sizeof(wacom_wac->name)) < 0) {
			hid_warn(wacom->hdev, "String overflow while assembling device name");
		}
	}

	return;
+1 −1
Original line number Diff line number Diff line
@@ -831,7 +831,7 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
	/* Enter report */
	if ((data[1] & 0xfc) == 0xc0) {
		/* serial number of the tool */
		wacom->serial[idx] = ((data[3] & 0x0f) << 28) +
		wacom->serial[idx] = ((__u64)(data[3] & 0x0f) << 28) +
			(data[4] << 20) + (data[5] << 12) +
			(data[6] << 4) + (data[7] >> 4);