@@ -279,27 +279,18 @@ static int get_usage(uint8_t *report_descriptor, size_t size,
279279 return -1 ; /* failure */
280280}
281281
282- /* Retrieves the largest input report size (in bytes) from the report descriptor.
283-
284- Requires an opened device with *claimed interface*.
285-
282+ /* Retrieves the largest input report size (in bytes) from the passed in report descriptor.
286283 The return value is the size on success and -1 on failure. */
287- static size_t get_max_input_report_size (libusb_device_handle * handle , int interface_num , uint16_t expected_report_descriptor_size )
284+ static size_t get_max_input_report_size (uint8_t * report_descriptor , int desc_size )
288285{
289286 int i = 0 ;
290287 int size_code ;
291288 int data_len , key_size ;
292289
293- int64_t report_size = 0 , report_count = 0 ;
290+ int64_t report_size = -1 , report_count = -1 ;
291+ ssize_t cur_size = 0 ;
294292 ssize_t max_size = -1 ;
295293
296- unsigned char report_descriptor [HID_API_MAX_REPORT_DESCRIPTOR_SIZE ];
297-
298- int desc_size = hid_get_report_descriptor_libusb (handle , interface_num , expected_report_descriptor_size , report_descriptor , sizeof (report_descriptor ));
299- if (desc_size < 0 ) {
300- return -1 ;
301- }
302-
303294 while (i < desc_size ) {
304295 int key = report_descriptor [i ];
305296 int key_cmd = key & 0xfc ;
@@ -325,26 +316,41 @@ static size_t get_max_input_report_size(libusb_device_handle *handle, int interf
325316 key_size = 1 ;
326317 }
327318
328- if (key_cmd == 0x94 ) {
319+ if (key_cmd == 0x94 ) { /* Report Count */
329320 report_count = get_bytes (report_descriptor , desc_size , data_len , i );
330321 }
331- if (key_cmd == 0x74 ) {
322+ if (key_cmd == 0x74 ) { /* Report Size */
332323 report_size = get_bytes (report_descriptor , desc_size , data_len , i );
333324 }
334- if (key_cmd == 0x80 ) { // Input
335- /* report_size is in bits. Determine the total size (count * size),
336- convert to bytes (rounded up), and add one byte for the report
337- number. */
338- ssize_t size = (((report_count * report_size ) + 7 ) / 8 ) + 1 ;
339- if (size > max_size )
340- max_size = size ;
325+ if (key_cmd == 0x80 ) { /* Input */
326+ if (report_count < 0 || report_size < 0 ) {
327+ /* We are missing size or count. That isn't good. */
328+ return 0 ;
329+ }
330+ cur_size += (report_count * report_size );
331+ }
332+ if (key_cmd == 0x84 ) { /* Report ID */
333+ if (cur_size > max_size ) {
334+ max_size = cur_size ;
335+ }
336+ cur_size = 0 ;
341337 }
342338
343339 /* Skip over this key and it's associated data */
344340 i += data_len + key_size ;
345341 }
346342
347- return max_size ;
343+ if (cur_size > max_size ) {
344+ max_size = cur_size ;
345+ }
346+
347+ if (max_size < 0 ) {
348+ return -1 ;
349+ }
350+
351+ /* report_size is in bits. Determine the total size convert to bytes
352+ (rounded up), and add one byte for the report number. */
353+ return ((max_size + 7 ) / 8 ) + 1 ;
348354}
349355
350356#if defined(__FreeBSD__ ) && __FreeBSD__ < 10
@@ -1294,7 +1300,15 @@ static int hidapi_initialize_device(hid_device *dev, const struct libusb_interfa
12941300 dev -> interface = intf_desc -> bInterfaceNumber ;
12951301
12961302 dev -> report_descriptor_size = get_report_descriptor_size_from_interface_descriptors (intf_desc );
1297- dev -> max_input_report_size = get_max_input_report_size (dev -> device_handle , dev -> interface , dev -> report_descriptor_size );
1303+
1304+ unsigned char report_descriptor [HID_API_MAX_REPORT_DESCRIPTOR_SIZE ];
1305+
1306+ int desc_size = hid_get_report_descriptor_libusb (dev -> device_handle , dev -> interface , dev -> report_descriptor_size , report_descriptor , sizeof (report_descriptor ));
1307+ if (desc_size > 0 ) {
1308+ dev -> max_input_report_size = get_max_input_report_size (report_descriptor , desc_size );
1309+ } else {
1310+ dev -> max_input_report_size = -1 ;
1311+ }
12981312
12991313 dev -> input_endpoint = 0 ;
13001314 dev -> input_ep_max_packet_size = 0 ;
0 commit comments