From: Tormod Volden <debian.tor...@gmail.com> Thanks to Uwe Bonnes and Satz Klauer for pointing it out.
Also adjusted a couple of related diagnostic messages. Signed-off-by: Tormod Volden <debian.tor...@gmail.com> --- Uwe once actually sent me a patch for what Satz pointed out, but it needed to be refreshed for the current code. Cheers, Tormod src/main.c | 42 ++++++++++++++++++++++++++++-------------- 1 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/main.c b/src/main.c index 4c96f88..eebce1e 100644 --- a/src/main.c +++ b/src/main.c @@ -76,10 +76,14 @@ static int find_dfu_if(libusb_device *dev, int rc; memset(dfu_if, 0, sizeof(*dfu_if)); - libusb_get_device_descriptor(dev, &desc); + rc = libusb_get_device_descriptor(dev, &desc); + if (rc) + return rc; for (cfg_idx = 0; cfg_idx < desc.bNumConfigurations; cfg_idx++) { - libusb_get_config_descriptor(dev, cfg_idx, &cfg); + rc = libusb_get_config_descriptor(dev, cfg_idx, &cfg); + if (rc) + return rc; /* in some cases, noticably FreeBSD if uid != 0, * the configuration descriptors are empty */ if (!cfg) @@ -204,7 +208,8 @@ static int get_alt_name(struct dfu_if *dfu_if, unsigned char *name) ret = -1; if (alt_name_str_idx) { if (!dfu_if->dev_handle) - libusb_open(dfu_if->dev, &dfu_if->dev_handle); + if (libusb_open(dfu_if->dev, &dfu_if->dev_handle)) + dfu_if->dev_handle = NULL; if (dfu_if->dev_handle) ret = libusb_get_string_descriptor_ascii( dfu_if->dev_handle, alt_name_str_idx, @@ -299,7 +304,8 @@ static int iterate_dfu_devices(libusb_context *ctx, struct dfu_if *dif, (libusb_get_bus_number(dev) != dif->bus || libusb_get_device_address(dev) != dif->devnum)) continue; - libusb_get_device_descriptor(dev, &desc); + if (libusb_get_device_descriptor(dev, &desc)) + continue; if (dif && (dif->flags & DFU_IFF_VENDOR) && desc.idVendor != dif->vendor) continue; @@ -437,12 +443,17 @@ static int usb_get_any_descriptor(struct libusb_device_handle *dev_handle, uint8_t desc_index, unsigned char *resbuf, int res_len) { - struct libusb_device *dev = libusb_get_device(dev_handle); + struct libusb_device *dev; struct libusb_config_descriptor *config; int ret; uint16_t conflen; unsigned char *cbuf; + dev = libusb_get_device(dev_handle); + if (!dev) { + fprintf(stderr, "Error: Broken device handle\n"); + return -1; + } /* Get the total length of the configuration descriptors */ ret = libusb_get_active_config_descriptor(dev, &config); if (ret == LIBUSB_ERROR_NOT_FOUND) { @@ -767,10 +778,10 @@ int main(int argc, char **argv) /* We have exactly one device. Its libusb_device is now in dif->dev */ - printf("Opening DFU USB device... "); - libusb_open(dif->dev, &dif->dev_handle); - if (!dif->dev_handle) { - fprintf(stderr, "Cannot open device \n"); + printf("Opening DFU capable USB device... "); + ret = libusb_open(dif->dev, &dif->dev_handle); + if (ret || !dif->dev_handle) { + fprintf(stderr, "Cannot open device\n"); exit(1); } @@ -903,7 +914,7 @@ int main(int argc, char **argv) } if (!ret) { fprintf(stderr, - "Can't resolve path after RESET?\n"); + "Cannot resolve path after RESET?\n"); exit(1); } } @@ -921,9 +932,9 @@ int main(int argc, char **argv) if (!get_first_dfu_device(ctx, dif)) exit(3); - printf("Opening USB Device...\n"); - libusb_open(dif->dev, &dif->dev_handle); - if (!dif->dev_handle) { + printf("Opening DFU USB Device...\n"); + ret = libusb_open(dif->dev, &dif->dev_handle); + if (ret || !dif->dev_handle) { fprintf(stderr, "Cannot open device\n"); exit(1); } @@ -1093,7 +1104,10 @@ status_again: } /* DFU specification */ struct libusb_device_descriptor desc; - libusb_get_device_descriptor(dif->dev, &desc); + if (libusb_get_device_descriptor(dif->dev, &desc)) { + fprintf(stderr, "Error: Failed to get device descriptor\n"); + exit(1); + } if (transfer_size < desc.bMaxPacketSize0) { transfer_size = desc.bMaxPacketSize0; printf("Adjusted transfer size to %i\n", transfer_size); -- 1.7.0.4 _______________________________________________ devel mailing list devel@lists.openmoko.org https://lists.openmoko.org/mailman/listinfo/devel