From 9d638dab09426be6349d41a269281921febcfa34 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Wed, 21 Apr 2021 12:39:52 -0700 Subject: [PATCH 1/1] Don't fail reading missing strings. This happens i.e. when serial number is not set -- in such case the string is missing from string descriptor list. --- src/ftdi.c | 24 ++++++++++++++++++------ 1 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/ftdi.c b/src/ftdi.c index 88216bf..5ec3e2c 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -485,27 +485,39 @@ int ftdi_usb_get_strings2(struct ftdi_context *ftdi, struct libusb_device *dev, if (libusb_get_device_descriptor(dev, &desc) < 0) ftdi_error_return(-11, "libusb_get_device_descriptor() failed"); - if (manufacturer != NULL) + if (manufacturer != NULL && mnf_len > 0) { - if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iManufacturer, (unsigned char *)manufacturer, mnf_len) < 0) + if (desc.iManufacturer == 0) + { + manufacturer[0] = '\0'; + } + else if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iManufacturer, (unsigned char *)manufacturer, mnf_len) < 0) { ftdi_usb_close_internal (ftdi); ftdi_error_return(-7, "libusb_get_string_descriptor_ascii() failed"); } } - if (description != NULL) + if (description != NULL && desc_len > 0) { - if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iProduct, (unsigned char *)description, desc_len) < 0) + if (desc.iProduct == 0) + { + description[0] = '\0'; + } + else if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iProduct, (unsigned char *)description, desc_len) < 0) { ftdi_usb_close_internal (ftdi); ftdi_error_return(-8, "libusb_get_string_descriptor_ascii() failed"); } } - if (serial != NULL) + if (serial != NULL && serial_len > 0) { - if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iSerialNumber, (unsigned char *)serial, serial_len) < 0) + if (desc.iSerialNumber == 0) + { + serial[0] = '\0'; + } + else if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iSerialNumber, (unsigned char *)serial, serial_len) < 0) { ftdi_usb_close_internal (ftdi); ftdi_error_return(-9, "libusb_get_string_descriptor_ascii() failed"); -- 1.7.1