[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