Skip to content

Commit ea427a2

Browse files
cradiatorbentiss
authored andcommitted
HID: core: Fix deadloop in hid_apply_multiplier.
The initial value of hid->collection[].parent_idx if 0. When Report descriptor doesn't contain "HID Collection", the value remains as 0. In the meanwhile, when the Report descriptor fullfill all following conditions, it will trigger hid_apply_multiplier function call. 1. Usage page is Generic Desktop Ctrls (0x01) 2. Usage is RESOLUTION_MULTIPLIER (0x48) 3. Contain any FEATURE items The while loop in hid_apply_multiplier will search the top-most collection by searching parent_idx == -1. Because all parent_idx is 0. The loop will run forever. There is a Report Descriptor triggerring the deadloop 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 0x09, 0x48, // Usage (0x48) 0x95, 0x01, // Report Count (1) 0x75, 0x08, // Report Size (8) 0xB1, 0x01, // Feature Signed-off-by: Xin Zhao <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Benjamin Tissoires <[email protected]>
1 parent cb963b2 commit ea427a2

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

drivers/hid/hid-core.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,6 +1202,7 @@ int hid_open_report(struct hid_device *device)
12021202
__u8 *end;
12031203
__u8 *next;
12041204
int ret;
1205+
int i;
12051206
static int (*dispatch_type[])(struct hid_parser *parser,
12061207
struct hid_item *item) = {
12071208
hid_parser_main,
@@ -1252,6 +1253,8 @@ int hid_open_report(struct hid_device *device)
12521253
goto err;
12531254
}
12541255
device->collection_size = HID_DEFAULT_NUM_COLLECTIONS;
1256+
for (i = 0; i < HID_DEFAULT_NUM_COLLECTIONS; i++)
1257+
device->collection[i].parent_idx = -1;
12551258

12561259
ret = -EINVAL;
12571260
while ((next = fetch_item(start, end, &item)) != NULL) {

0 commit comments

Comments
 (0)