Skip to content

Commit

Permalink
HID: zeroplus: validate output report details
Browse files Browse the repository at this point in the history
The zeroplus HID driver was not checking the size of allocated values
in fields it used. A HID device could send a malicious output report
that would cause the driver to write beyond the output report allocation
during initialization, causing a heap overflow:

[ 1442.728680] usb 1-1: New USB device found, idVendor=0c12, idProduct=0005
...
[ 1466.243173] BUG kmalloc-192 (Tainted: G        W   ): Redzone overwritten

CVE-2013-2889

Signed-off-by: Kees Cook <keescook@chromium.org>
Cc: stable@vger.kernel.org
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
  • Loading branch information
Kees Cook authored and Jiri Kosina committed Sep 13, 2013
1 parent 331415f commit 78214e8
Showing 1 changed file with 5 additions and 13 deletions.
18 changes: 5 additions & 13 deletions drivers/hid/hid-zpff.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,21 +68,13 @@ static int zpff_init(struct hid_device *hid)
struct hid_report *report;
struct hid_input *hidinput = list_entry(hid->inputs.next,
struct hid_input, list);
struct list_head *report_list =
&hid->report_enum[HID_OUTPUT_REPORT].report_list;
struct input_dev *dev = hidinput->input;
int error;
int i, error;

if (list_empty(report_list)) {
hid_err(hid, "no output report found\n");
return -ENODEV;
}

report = list_entry(report_list->next, struct hid_report, list);

if (report->maxfield < 4) {
hid_err(hid, "not enough fields in report\n");
return -ENODEV;
for (i = 0; i < 4; i++) {
report = hid_validate_values(hid, HID_OUTPUT_REPORT, 0, i, 1);
if (!report)
return -ENODEV;
}

zpff = kzalloc(sizeof(struct zpff_device), GFP_KERNEL);
Expand Down

0 comments on commit 78214e8

Please sign in to comment.