[PATCH dfu-util] main: Check return value on all libusb calls
Tormod Volden
lists.tormod at gmail.com
Wed Nov 16 23:43:22 CET 2011
From: Tormod Volden <debian.tormod at 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.tormod at 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
More information about the devel
mailing list