Message ID | 1230b0c19fd21fdc4d0eb30f3e32e67fff86fef9.1563818405.git.mirq-linux@rere.qmqm.pl (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Jiri Kosina |
Headers | show |
Series | [RESEND] HID: fix error message in hid_open_report() | expand |
On Mon, 22 Jul 2019, Michał Mirosław wrote: > On HID report descriptor parsing error the code displays bogus > pointer instead of error offset (subtracts start=NULL from end). > Make the message more useful by displaying correct error offset > and include total buffer size for reference. > > This was carried over from ancient times - "Fixed" commit just > promoted the message from DEBUG to ERROR. > > Cc: stable@vger.kernel.org > Fixes: 8c3d52fc393b ("HID: make parser more verbose about parsing errors by default") > Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl> [ ... snip ... ] > @@ -1230,7 +1232,8 @@ int hid_open_report(struct hid_device *device) > } > } > > - hid_err(device, "item fetching failed at offset %d\n", (int)(end - start)); > + hid_err(device, "item fetching failed at offset %zu/%zu\n", > + size - (end - start), size); Hi Michal, thanks for the fix. This causes: drivers/hid/hid-core.c: In function ‘hid_open_report’: drivers/hid/hid-core.c:1235:2: warning: format ‘%zu’ expects argument of type ‘size_t’, but argument 4 has type ‘unsigned int’ [-Wformat=] hid_err(device, "item fetching failed at offset %zu/%zu\n", ^ could you please fix that up and resubmit? Thanks,
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 210b81a56e1a..bb74b7ff4e6a 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c @@ -1139,6 +1139,7 @@ int hid_open_report(struct hid_device *device) __u8 *start; __u8 *buf; __u8 *end; + __u8 *next; int ret; static int (*dispatch_type[])(struct hid_parser *parser, struct hid_item *item) = { @@ -1192,7 +1193,8 @@ int hid_open_report(struct hid_device *device) device->collection_size = HID_DEFAULT_NUM_COLLECTIONS; ret = -EINVAL; - while ((start = fetch_item(start, end, &item)) != NULL) { + while ((next = fetch_item(start, end, &item)) != NULL) { + start = next; if (item.format != HID_ITEM_FORMAT_SHORT) { hid_err(device, "unexpected long global item\n"); @@ -1230,7 +1232,8 @@ int hid_open_report(struct hid_device *device) } } - hid_err(device, "item fetching failed at offset %d\n", (int)(end - start)); + hid_err(device, "item fetching failed at offset %zu/%zu\n", + size - (end - start), size); err: kfree(parser->collection_stack); alloc_err: