aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/drivers/hid/hid-betopff.c
diff options
context:
space:
mode:
authorPietro Borrello <borrello@diag.uniroma1.it>2023-01-11 18:12:16 +0000
committerJiri Kosina <jkosina@suse.cz>2023-01-18 16:34:35 +0100
commit3782c0d6edf658b71354a64d60aa7a296188fc90 (patch)
tree1e75cc5e855e4f234f4c9d5b93e6f24cdde00c4d /drivers/hid/hid-betopff.c
parentHID: playstation: sanity check DualSense calibration data. (diff)
downloadwireguard-linux-3782c0d6edf658b71354a64d60aa7a296188fc90.tar.xz
wireguard-linux-3782c0d6edf658b71354a64d60aa7a296188fc90.zip
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: 52cd7785f3cd ("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>
Diffstat (limited to 'drivers/hid/hid-betopff.c')
-rw-r--r--drivers/hid/hid-betopff.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/drivers/hid/hid-betopff.c b/drivers/hid/hid-betopff.c
index 467d789f9bc2..25ed7b9a917e 100644
--- a/drivers/hid/hid-betopff.c
+++ b/drivers/hid/hid-betopff.c
@@ -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;