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:
parent
3eb4351af4
commit
ba53219809
1 changed files with 19 additions and 0 deletions
|
@ -427,6 +427,7 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
|
||||||
{
|
{
|
||||||
__u32 data;
|
__u32 data;
|
||||||
unsigned n;
|
unsigned n;
|
||||||
|
__u32 count;
|
||||||
|
|
||||||
data = item_udata(item);
|
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)
|
if (item->size <= 2)
|
||||||
data = (parser->global.usage_page << 16) + data;
|
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++)
|
for (n = parser->local.usage_minimum; n <= data; n++)
|
||||||
if (hid_add_usage(parser, n)) {
|
if (hid_add_usage(parser, n)) {
|
||||||
dbg_hid("hid_add_usage failed\n");
|
dbg_hid("hid_add_usage failed\n");
|
||||||
|
|
Loading…
Add table
Reference in a new issue