From f6d2cb561402c3b6d3627c0eb89e009b503d9067 Sun 17 01 11:38:45 2021 From: Simon Vogl Date: Sun, 17 Jan 2021 11:38:45 UTC Subject: [PATCH] Fix USB Device enumeration This patch fixes a regression introduced in libusb 1.0.24 that prevents certain devices like smartphones from being detected. diff --git a/libusb/os/linux_usbfs.c b/libusb/os/linux_usbfs.c index fb2ed53a..4d2dc8d6 100644 --- a/libusb/os/linux_usbfs.c +++ b/libusb/os/linux_usbfs.c @@ -641,7 +641,12 @@ static int seek_to_next_config(struct libusb_context *ctx, uint8_t *buffer, size_t len) { struct usbi_descriptor_header *header; - int offset = 0; + int offset; + + /* Start seeking past the config descriptor */ + offset = LIBUSB_DT_CONFIG_SIZE; + buffer += LIBUSB_DT_CONFIG_SIZE; + len -= LIBUSB_DT_CONFIG_SIZE; while (len > 0) { if (len < 2) { @@ -718,7 +723,7 @@ static int parse_config_descriptors(struct libusb_device *dev) } if (priv->sysfs_dir) { - /* + /* * In sysfs wTotalLength is ignored, instead the kernel returns a * config descriptor with verified bLength fields, with descriptors * with an invalid bLength removed. @@ -727,8 +732,7 @@ static int parse_config_descriptors(struct libusb_device *dev) int offset; if (num_configs > 1 && idx < num_configs - 1) { - offset = seek_to_next_config(ctx, buffer + LIBUSB_DT_CONFIG_SIZE, - remaining - LIBUSB_DT_CONFIG_SIZE); + offset = seek_to_next_config(ctx, buffer, remaining); if (offset < 0) return offset; sysfs_config_len = (uint16_t)offset;