|
@@ -128,9 +128,19 @@ static int open_collection(struct hid_parser *parser, unsigned type)
|
|
|
|
|
|
usage = parser->local.usage[0];
|
|
|
|
|
|
- if (parser->collection_stack_ptr == HID_COLLECTION_STACK_SIZE) {
|
|
|
- hid_err(parser->device, "collection stack overflow\n");
|
|
|
- return -EINVAL;
|
|
|
+ if (parser->collection_stack_ptr == parser->collection_stack_size) {
|
|
|
+ unsigned int *collection_stack;
|
|
|
+ unsigned int new_size = parser->collection_stack_size +
|
|
|
+ HID_COLLECTION_STACK_SIZE;
|
|
|
+
|
|
|
+ collection_stack = krealloc(parser->collection_stack,
|
|
|
+ new_size * sizeof(unsigned int),
|
|
|
+ GFP_KERNEL);
|
|
|
+ if (!collection_stack)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ parser->collection_stack = collection_stack;
|
|
|
+ parser->collection_stack_size = new_size;
|
|
|
}
|
|
|
|
|
|
if (parser->device->maxcollection == parser->device->collection_size) {
|
|
@@ -840,6 +850,7 @@ static int hid_scan_report(struct hid_device *hid)
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
+ kfree(parser->collection_stack);
|
|
|
vfree(parser);
|
|
|
return 0;
|
|
|
}
|