svn commit: r368632 - head/lib/libusb

Hans Petter Selasky hselasky at FreeBSD.org
Mon Dec 14 11:56:17 UTC 2020


Author: hselasky
Date: Mon Dec 14 11:56:16 2020
New Revision: 368632
URL: https://svnweb.freebsd.org/changeset/base/368632

Log:
  Be bug compatible with other operating systems by allowing non-sequential
  interface numbering for USB descriptors in userspace. Else certain USB
  control requests using the interface number, won't be recognized by the
  USB firmware.
  
  Refer to section 9.2.3 in the USB 2.0 specification:
  Interfaces are numbered from zero to one less than the number of concurrent interfaces
  supported by the configuration.
  
  PR:		251784
  MFC after:	1 week
  Sponsored by:	Mellanox Technologies // NVIDIA Networking

Modified:
  head/lib/libusb/libusb20_desc.c

Modified: head/lib/libusb/libusb20_desc.c
==============================================================================
--- head/lib/libusb/libusb20_desc.c	Mon Dec 14 11:09:07 2020	(r368631)
+++ head/lib/libusb/libusb20_desc.c	Mon Dec 14 11:56:16 2020	(r368632)
@@ -81,9 +81,10 @@ libusb20_parse_config_desc(const void *config_desc)
 	if (ptr[1] != LIBUSB20_DT_CONFIG) {
 		return (NULL);		/* not config descriptor */
 	}
+
 	/*
-	 * The first "bInterfaceNumber" should never have the value 0xff.
-	 * Then it is corrupt.
+	 * The first "bInterfaceNumber" cannot start at 0xFFFF
+	 * because the field is 8-bit.
 	 */
 	niface_no_alt = 0;
 	nendpoint = 0;
@@ -206,12 +207,15 @@ libusb20_parse_config_desc(const void *config_desc)
 			if (libusb20_me_decode(ptr, ptr[0], &last_if->desc)) {
 				/* ignore */
 			}
-			/*
-			 * Sometimes USB devices have corrupt interface
-			 * descriptors and we need to overwrite the provided
-			 * interface number!
-			 */
-			last_if->desc.bInterfaceNumber = niface - 1;
+
+			/* detect broken USB descriptors when USB debugging is enabled */
+			if (last_if->desc.bInterfaceNumber != (uint8_t)(niface - 1)) {
+				const char *str = getenv("LIBUSB_DEBUG");
+				if (str != NULL && str[0] != '\0' && str[0] != '0') {
+					printf("LIBUSB_DEBUG: bInterfaceNumber(%u) is not sequential(%u)\n",
+					    last_if->desc.bInterfaceNumber, niface - 1);
+				}
+			}
 			last_if->extra.ptr = LIBUSB20_ADD_BYTES(ptr, ptr[0]);
 			last_if->extra.len = 0;
 			last_if->extra.type = LIBUSB20_ME_IS_RAW;


More information about the svn-src-all mailing list