Skip to content

Commit

Permalink
Input: gtco - bounds check collection indent level
Browse files Browse the repository at this point in the history
commit 2a017fd82c5402b3c8df5e3d6e5165d9e6147dc1 upstream.

The GTCO tablet input driver configures itself from an HID report sent
via USB during the initial enumeration process. Some debugging messages
are generated during the parsing. A debugging message indentation
counter is not bounds checked, leading to the ability for a specially
crafted HID report to cause '-' and null bytes be written past the end
of the indentation array. As long as the kernel has CONFIG_DYNAMIC_DEBUG
enabled, this code will not be optimized out.  This was discovered
during code review after a previous syzkaller bug was found in this
driver.

Signed-off-by: Grant Hernandez <[email protected]>
Cc: [email protected]
Signed-off-by: Dmitry Torokhov <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
Grant Hernandez authored and Daniel Wang committed Jan 3, 2020
1 parent acc05ed commit 1b347ec
Showing 1 changed file with 17 additions and 3 deletions.
20 changes: 17 additions & 3 deletions drivers/input/tablet/gtco.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ Scott Hill [email protected]

/* Max size of a single report */
#define REPORT_MAX_SIZE 10
#define MAX_COLLECTION_LEVELS 10


/* Bitmask whether pen is in range */
Expand Down Expand Up @@ -223,8 +224,7 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report,
char maintype = 'x';
char globtype[12];
int indent = 0;
char indentstr[10] = "";

char indentstr[MAX_COLLECTION_LEVELS + 1] = { 0 };

dev_dbg(ddev, "======>>>>>>PARSE<<<<<<======\n");

Expand Down Expand Up @@ -350,6 +350,13 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report,
case TAG_MAIN_COL_START:
maintype = 'S';

if (indent == MAX_COLLECTION_LEVELS) {
dev_err(ddev, "Collection level %d would exceed limit of %d\n",
indent + 1,
MAX_COLLECTION_LEVELS);
break;
}

if (data == 0) {
dev_dbg(ddev, "======>>>>>> Physical\n");
strcpy(globtype, "Physical");
Expand All @@ -369,8 +376,15 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report,
break;

case TAG_MAIN_COL_END:
dev_dbg(ddev, "<<<<<<======\n");
maintype = 'E';

if (indent == 0) {
dev_err(ddev, "Collection level already at zero\n");
break;
}

dev_dbg(ddev, "<<<<<<======\n");

indent--;
for (x = 0; x < indent; x++)
indentstr[x] = '-';
Expand Down

0 comments on commit 1b347ec

Please sign in to comment.