mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 04:38:03 +00:00
HID: betop: check shape of output reports
betopff_init() only checks the total sum of the report counts for each
report field to be at least 4, but hid_betopff_play() expects 4 report
fields.
A device advertising an output report with one field and 4 report counts
would pass the check but crash the kernel with a NULL pointer dereference
in hid_betopff_play().
Fixes: 52cd7785f3
("HID: betop: add drivers/hid/hid-betopff.c")
Signed-off-by: Pietro Borrello <borrello@diag.uniroma1.it>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
parent
ccf1e1626d
commit
3782c0d6ed
@ -60,7 +60,6 @@ static int betopff_init(struct hid_device *hid)
|
||||
struct list_head *report_list =
|
||||
&hid->report_enum[HID_OUTPUT_REPORT].report_list;
|
||||
struct input_dev *dev;
|
||||
int field_count = 0;
|
||||
int error;
|
||||
int i, j;
|
||||
|
||||
@ -86,19 +85,21 @@ static int betopff_init(struct hid_device *hid)
|
||||
* -----------------------------------------
|
||||
* Do init them with default value.
|
||||
*/
|
||||
if (report->maxfield < 4) {
|
||||
hid_err(hid, "not enough fields in the report: %d\n",
|
||||
report->maxfield);
|
||||
return -ENODEV;
|
||||
}
|
||||
for (i = 0; i < report->maxfield; i++) {
|
||||
if (report->field[i]->report_count < 1) {
|
||||
hid_err(hid, "no values in the field\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
for (j = 0; j < report->field[i]->report_count; j++) {
|
||||
report->field[i]->value[j] = 0x00;
|
||||
field_count++;
|
||||
}
|
||||
}
|
||||
|
||||
if (field_count < 4) {
|
||||
hid_err(hid, "not enough fields in the report: %d\n",
|
||||
field_count);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
betopff = kzalloc(sizeof(*betopff), GFP_KERNEL);
|
||||
if (!betopff)
|
||||
return -ENOMEM;
|
||||
|
Loading…
Reference in New Issue
Block a user