aboutsummaryrefslogtreecommitdiff
path: root/lib/libusb/libusb20_desc.c
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2020-12-14 11:56:16 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2020-12-14 11:56:16 +0000
commit10557931153c8e347251b95418fe0f45dc2262dd (patch)
treedbc7af2f4f0f19a8d7536b21febf22e4fc7043cc /lib/libusb/libusb20_desc.c
parentf32672272f37100dfa23f1f01c16d6388543ba64 (diff)
downloadsrc-10557931153c8e347251b95418fe0f45dc2262dd.tar.gz
src-10557931153c8e347251b95418fe0f45dc2262dd.zip
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
Notes
Notes: svn path=/head/; revision=368632
Diffstat (limited to 'lib/libusb/libusb20_desc.c')
-rw-r--r--lib/libusb/libusb20_desc.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/lib/libusb/libusb20_desc.c b/lib/libusb/libusb20_desc.c
index 517a2e5972c3..3052af09e9c2 100644
--- a/lib/libusb/libusb20_desc.c
+++ b/lib/libusb/libusb20_desc.c
@@ -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;