Commit f39dda98 authored by Linus Torvalds's avatar Linus Torvalds

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
...@@ -586,6 +586,8 @@ static const struct hid_device_id hammer_devices[] = { ...@@ -586,6 +586,8 @@ static const struct hid_device_id hammer_devices[] = {
USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_EEL) }, USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_EEL) },
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_HAMMER) }, 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, { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_MAGNEMITE) }, USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_MAGNEMITE) },
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
......
...@@ -529,6 +529,7 @@ ...@@ -529,6 +529,7 @@
#define USB_DEVICE_ID_GOOGLE_MOONBALL 0x5044 #define USB_DEVICE_ID_GOOGLE_MOONBALL 0x5044
#define USB_DEVICE_ID_GOOGLE_DON 0x5050 #define USB_DEVICE_ID_GOOGLE_DON 0x5050
#define USB_DEVICE_ID_GOOGLE_EEL 0x5057 #define USB_DEVICE_ID_GOOGLE_EEL 0x5057
#define USB_DEVICE_ID_GOOGLE_JEWEL 0x5061
#define USB_VENDOR_ID_GOTOP 0x08f2 #define USB_VENDOR_ID_GOTOP 0x08f2
#define USB_DEVICE_ID_SUPER_Q2 0x007f #define USB_DEVICE_ID_SUPER_Q2 0x007f
......
...@@ -314,6 +314,7 @@ static int hidpp_send_message_sync(struct hidpp_device *hidpp, ...@@ -314,6 +314,7 @@ static int hidpp_send_message_sync(struct hidpp_device *hidpp,
dbg_hid("%s:timeout waiting for response\n", __func__); dbg_hid("%s:timeout waiting for response\n", __func__);
memset(response, 0, sizeof(struct hidpp_report)); memset(response, 0, sizeof(struct hidpp_report));
ret = -ETIMEDOUT; ret = -ETIMEDOUT;
goto exit;
} }
if (response->report_id == REPORT_ID_HIDPP_SHORT && if (response->report_id == REPORT_ID_HIDPP_SHORT &&
......
...@@ -2224,7 +2224,9 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix) ...@@ -2224,7 +2224,9 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix)
} else if (strstr(product_name, "Wacom") || } else if (strstr(product_name, "Wacom") ||
strstr(product_name, "wacom") || 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 { } else {
snprintf(name, sizeof(name), "Wacom %s", product_name); snprintf(name, sizeof(name), "Wacom %s", product_name);
} }
...@@ -2242,7 +2244,9 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix) ...@@ -2242,7 +2244,9 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix)
if (name[strlen(name)-1] == ' ') if (name[strlen(name)-1] == ' ')
name[strlen(name)-1] = '\0'; name[strlen(name)-1] = '\0';
} else { } 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", 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) ...@@ -2410,8 +2414,13 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
goto fail_quirks; goto fail_quirks;
} }
if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR) if (features->device_type & WACOM_DEVICETYPE_WL_MONITOR) {
error = hid_hw_open(hdev); error = hid_hw_open(hdev);
if (error) {
hid_err(hdev, "hw open failed\n");
goto fail_quirks;
}
}
wacom_set_shared_values(wacom_wac); wacom_set_shared_values(wacom_wac);
devres_close_group(&hdev->dev, wacom); devres_close_group(&hdev->dev, wacom);
...@@ -2500,8 +2509,10 @@ static void wacom_wireless_work(struct work_struct *work) ...@@ -2500,8 +2509,10 @@ static void wacom_wireless_work(struct work_struct *work)
goto fail; goto fail;
} }
strscpy(wacom_wac->name, wacom_wac1->name, if (strscpy(wacom_wac->name, wacom_wac1->name,
sizeof(wacom_wac->name)); sizeof(wacom_wac->name)) < 0) {
hid_warn(wacom->hdev, "String overflow while assembling device name");
}
} }
return; return;
......
...@@ -831,7 +831,7 @@ static int wacom_intuos_inout(struct wacom_wac *wacom) ...@@ -831,7 +831,7 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
/* Enter report */ /* Enter report */
if ((data[1] & 0xfc) == 0xc0) { if ((data[1] & 0xfc) == 0xc0) {
/* serial number of the tool */ /* 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[4] << 20) + (data[5] << 12) +
(data[6] << 4) + (data[7] >> 4); (data[6] << 4) + (data[7] >> 4);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment