libusb: fix descriptor parsing

backported upstream commit
<https://github.com/libusb/libusb/commit/f6d2cb56>

which fixes a regression for multi-configuration devices, e.g. iPhone.
This commit is contained in:
noarchwastaken 2021-05-09 00:25:44 -04:00 committed by Érico Nogueira Rolim
parent 2a3216766e
commit 80fef9e498
2 changed files with 36 additions and 1 deletions

View file

@ -0,0 +1,35 @@
--- libusb/os/linux_usbfs.c
+++ 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;

View file

@ -1,7 +1,7 @@
# Template file for 'libusb' # Template file for 'libusb'
pkgname=libusb pkgname=libusb
version=1.0.24 version=1.0.24
revision=1 revision=2
build_style=gnu-configure build_style=gnu-configure
hostmakedepends="pkg-config" hostmakedepends="pkg-config"
makedepends="eudev-libudev-devel" makedepends="eudev-libudev-devel"