diff options
-rw-r--r-- | drivers/input/tablet/gtco.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/drivers/input/tablet/gtco.c b/drivers/input/tablet/gtco.c index b796e891e2ee..4b8b9d7aa75e 100644 --- a/drivers/input/tablet/gtco.c +++ b/drivers/input/tablet/gtco.c | |||
@@ -230,13 +230,17 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report, | |||
230 | 230 | ||
231 | /* Walk this report and pull out the info we need */ | 231 | /* Walk this report and pull out the info we need */ |
232 | while (i < length) { | 232 | while (i < length) { |
233 | prefix = report[i]; | 233 | prefix = report[i++]; |
234 | |||
235 | /* Skip over prefix */ | ||
236 | i++; | ||
237 | 234 | ||
238 | /* Determine data size and save the data in the proper variable */ | 235 | /* Determine data size and save the data in the proper variable */ |
239 | size = PREF_SIZE(prefix); | 236 | size = (1U << PREF_SIZE(prefix)) >> 1; |
237 | if (i + size > length) { | ||
238 | dev_err(ddev, | ||
239 | "Not enough data (need %d, have %d)\n", | ||
240 | i + size, length); | ||
241 | break; | ||
242 | } | ||
243 | |||
240 | switch (size) { | 244 | switch (size) { |
241 | case 1: | 245 | case 1: |
242 | data = report[i]; | 246 | data = report[i]; |
@@ -244,8 +248,7 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report, | |||
244 | case 2: | 248 | case 2: |
245 | data16 = get_unaligned_le16(&report[i]); | 249 | data16 = get_unaligned_le16(&report[i]); |
246 | break; | 250 | break; |
247 | case 3: | 251 | case 4: |
248 | size = 4; | ||
249 | data32 = get_unaligned_le32(&report[i]); | 252 | data32 = get_unaligned_le32(&report[i]); |
250 | break; | 253 | break; |
251 | } | 254 | } |