HID: core: do not reject devices when they declare too many usages
Some device present proprietary collections with a usage min of 0x00 and a usage max of 0xffff. hid-core currently reject them while most of the time this is harmless. Let's ignore the exceeding usages, and hope for the best. Reported-by: Simon Wörner <mail@simon-woerner.de> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Signed-off-by: Jiri Kosina <jkosina@suse.com>
This commit is contained in:
Родитель
3eb4351af4
Коммит
ba53219809
|
@ -427,6 +427,7 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
|
|||
{
|
||||
__u32 data;
|
||||
unsigned n;
|
||||
__u32 count;
|
||||
|
||||
data = item_udata(item);
|
||||
|
||||
|
@ -490,6 +491,24 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
|
|||
if (item->size <= 2)
|
||||
data = (parser->global.usage_page << 16) + data;
|
||||
|
||||
count = data - parser->local.usage_minimum;
|
||||
if (count + parser->local.usage_index >= HID_MAX_USAGES) {
|
||||
/*
|
||||
* We do not warn if the name is not set, we are
|
||||
* actually pre-scanning the device.
|
||||
*/
|
||||
if (dev_name(&parser->device->dev))
|
||||
hid_warn(parser->device,
|
||||
"ignoring exceeding usage max\n");
|
||||
data = HID_MAX_USAGES - parser->local.usage_index +
|
||||
parser->local.usage_minimum - 1;
|
||||
if (data <= 0) {
|
||||
hid_err(parser->device,
|
||||
"no more usage index available\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
for (n = parser->local.usage_minimum; n <= data; n++)
|
||||
if (hid_add_usage(parser, n)) {
|
||||
dbg_hid("hid_add_usage failed\n");
|
||||
|
|
Загрузка…
Ссылка в новой задаче