Skip to content

Commit

Permalink
Merge branch 'for-5.12/core' into for-linus
Browse files Browse the repository at this point in the history
- improved handling of generic HID keyboard (no more splitting system
  and consumer controls away), in order to make it easier for userspace
  to figure out the details of the device easier. From Dmitry Torokhov.

- report data sanitization fixes from Will McVicker and Randy Dunlap
  • Loading branch information
Jiri Kosina committed Feb 23, 2021
2 parents 88f3884 + 7c7d7ac commit 760f7e7
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 3 deletions.
9 changes: 6 additions & 3 deletions drivers/hid/hid-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ EXPORT_SYMBOL_GPL(hid_register_report);
* Register a new field for this report.
*/

static struct hid_field *hid_register_field(struct hid_report *report, unsigned usages, unsigned values)
static struct hid_field *hid_register_field(struct hid_report *report, unsigned usages)
{
struct hid_field *field;

Expand All @@ -101,7 +101,7 @@ static struct hid_field *hid_register_field(struct hid_report *report, unsigned

field = kzalloc((sizeof(struct hid_field) +
usages * sizeof(struct hid_usage) +
values * sizeof(unsigned)), GFP_KERNEL);
usages * sizeof(unsigned)), GFP_KERNEL);
if (!field)
return NULL;

Expand Down Expand Up @@ -300,7 +300,7 @@ static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsign
usages = max_t(unsigned, parser->local.usage_index,
parser->global.report_count);

field = hid_register_field(report, usages, parser->global.report_count);
field = hid_register_field(report, usages);
if (!field)
return 0;

Expand Down Expand Up @@ -1307,6 +1307,9 @@ EXPORT_SYMBOL_GPL(hid_open_report);

static s32 snto32(__u32 value, unsigned n)
{
if (!value || !n)
return 0;

switch (n) {
case 8: return ((__s8)value);
case 16: return ((__s16)value);
Expand Down
10 changes: 10 additions & 0 deletions drivers/hid/hid-input.c
Original file line number Diff line number Diff line change
Expand Up @@ -1856,6 +1856,16 @@ static struct hid_input *hidinput_match_application(struct hid_report *report)
list_for_each_entry(hidinput, &hid->inputs, list) {
if (hidinput->application == report->application)
return hidinput;

/*
* Keep SystemControl and ConsumerControl applications together
* with the main keyboard, if present.
*/
if ((report->application == HID_GD_SYSTEM_CONTROL ||
report->application == HID_CP_CONSUMER_CONTROL) &&
hidinput->application == HID_GD_KEYBOARD) {
return hidinput;
}
}

return NULL;
Expand Down

0 comments on commit 760f7e7

Please sign in to comment.