libmtp fails to recognize device, libusb-1.0.24 -current
by acbff0 from LinuxQuestions.org on (#5GP6Y)
Code:$ dmesg|tail
[ 1571.928595] usb 3-1: new high-speed USB device number 3 using xhci_hcd
[ 1572.055871] usb 3-1: New USB device found, idVendor=04e8, idProduct=6860, bcdDevice= 4.00
[ 1572.055880] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1572.055885] usb 3-1: Product: SAMSUNG_Android
[ 1572.055888] usb 3-1: Manufacturer: SAMSUNGCode:$ mtp-detect
libmtp version: 1.1.18
Listing raw device(s)
No raw devices found.The bug is with libusb-1.0.24, applying the following patch fixes the issue.
https://github.com/libusb/libusb/com...9e009b503d9067
Code: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;
diff --git a/libusb/version_nano.h b/libusb/version_nano.h
index 61a0a700..578b0979 100644
--- a/libusb/version_nano.h
+++ b/libusb/version_nano.h
@@ -1 +1 @@
-#define LIBUSB_NANO 11584
+#define LIBUSB_NANO 11586


[ 1571.928595] usb 3-1: new high-speed USB device number 3 using xhci_hcd
[ 1572.055871] usb 3-1: New USB device found, idVendor=04e8, idProduct=6860, bcdDevice= 4.00
[ 1572.055880] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1572.055885] usb 3-1: Product: SAMSUNG_Android
[ 1572.055888] usb 3-1: Manufacturer: SAMSUNGCode:$ mtp-detect
libmtp version: 1.1.18
Listing raw device(s)
No raw devices found.The bug is with libusb-1.0.24, applying the following patch fixes the issue.
https://github.com/libusb/libusb/com...9e009b503d9067
Code: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;
diff --git a/libusb/version_nano.h b/libusb/version_nano.h
index 61a0a700..578b0979 100644
--- a/libusb/version_nano.h
+++ b/libusb/version_nano.h
@@ -1 +1 @@
-#define LIBUSB_NANO 11584
+#define LIBUSB_NANO 11586