Skip to content

Commit b1b3062

Browse files
committed
Handle devices with swapped endpoint descriptors
Reported by Adam Iglewski on an iPhone 2G running 1.1.4
1 parent 32e2778 commit b1b3062

1 file changed

Lines changed: 15 additions & 8 deletions

File tree

daemon/usb-linux.c

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -334,16 +334,23 @@ int usb_discover(void)
334334
usbmuxd_log(LL_WARNING, "Endpoint count mismatch for interface %d of device %d-%d", intf->bInterfaceNumber, bus, address);
335335
continue;
336336
}
337-
if((intf->endpoint[0].bEndpointAddress & 0x80) != LIBUSB_ENDPOINT_OUT ||
338-
(intf->endpoint[1].bEndpointAddress & 0x80) != LIBUSB_ENDPOINT_IN) {
337+
if((intf->endpoint[0].bEndpointAddress & 0x80) == LIBUSB_ENDPOINT_OUT &&
338+
(intf->endpoint[1].bEndpointAddress & 0x80) == LIBUSB_ENDPOINT_IN) {
339+
usbdev->interface = intf->bInterfaceNumber;
340+
usbdev->ep_out = intf->endpoint[0].bEndpointAddress;
341+
usbdev->ep_in = intf->endpoint[1].bEndpointAddress;
342+
usbmuxd_log(LL_INFO, "Found interface %d with endpoints %02x/%02x for device %d-%d", usbdev->interface, usbdev->ep_out, usbdev->ep_in, bus, address);
343+
break;
344+
} else if((intf->endpoint[1].bEndpointAddress & 0x80) == LIBUSB_ENDPOINT_OUT &&
345+
(intf->endpoint[0].bEndpointAddress & 0x80) == LIBUSB_ENDPOINT_IN) {
346+
usbdev->interface = intf->bInterfaceNumber;
347+
usbdev->ep_out = intf->endpoint[1].bEndpointAddress;
348+
usbdev->ep_in = intf->endpoint[0].bEndpointAddress;
349+
usbmuxd_log(LL_INFO, "Found interface %d with swapped endpoints %02x/%02x for device %d-%d", usbdev->interface, usbdev->ep_out, usbdev->ep_in, bus, address);
350+
break;
351+
} else {
339352
usbmuxd_log(LL_WARNING, "Endpoint type mismatch for interface %d of device %d-%d", intf->bInterfaceNumber, bus, address);
340-
continue;
341353
}
342-
usbdev->interface = intf->bInterfaceNumber;
343-
usbdev->ep_out = intf->endpoint[0].bEndpointAddress;
344-
usbdev->ep_in = intf->endpoint[1].bEndpointAddress;
345-
usbmuxd_log(LL_INFO, "Found interface %d with endpoints %02x/%02x for device %d-%d", usbdev->interface, usbdev->ep_out, usbdev->ep_in, bus, address);
346-
break;
347354
}
348355
libusb_free_config_descriptor(config);
349356

0 commit comments

Comments
 (0)