Hi, We have found a problem that happens if there are * multiple FTDI 4232H devices connected to a PC via USB; * one of these does not have a programmed eeprom, and * I would like to open another one based on the product description or serial number. The problem occurs because libusb_get_string_descriptor_ascii() will return an error. We should not care about this because we are searching for a different device. What happens though is that ftdi_usb_open_desc_index() will just return, because it calls the macro "ftdi_error_return_free_device". Instead, we should store the error message, and if no matching device is found, then that error should be returned instead of the generic "device not found".
Attached is a proposed patch; thank you for providing this library and thank you for your consideration. - Karl Koehler --- --- a/libftdi1-1.5/src/ftdi.c 2020-07-07 12:32:55.000000000 -0700 +++ b/libftdi1-1.5/src/ftdi.c 2025-08-01 15:12:06.335941198 -0700 @@ -769,6 +769,9 @@ char string[256]; int i = 0; + const char* error_string = NULL; + int error_code = 0; + if (ftdi == NULL) ftdi_error_return(-11, "ftdi context invalid"); @@ -785,15 +788,15 @@ if (desc.idVendor == vendor && desc.idProduct == product) { - if (libusb_open(dev, &ftdi->usb_dev) < 0) - ftdi_error_return_free_device_list(-4, "usb_open() failed", devs); - + if (libusb_open(dev, &ftdi->usb_dev) < 0) { + error_string = "usb_open() failed"; error_code = -4; continue; + } if (description != NULL) { if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iProduct, (unsigned char *)string, sizeof(string)) < 0) { ftdi_usb_close_internal (ftdi); - ftdi_error_return_free_device_list(-8, "unable to fetch product description", devs); + error_string = "unable to fetch product description"; error_code = -8; continue; } if (strncmp(string, description, sizeof(string)) != 0) { @@ -806,7 +809,7 @@ if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iSerialNumber, (unsigned char *)string, sizeof(string)) < 0) { ftdi_usb_close_internal (ftdi); - ftdi_error_return_free_device_list(-9, "unable to fetch serial number", devs); + error_string = "unable to fetch serial number"; error_code = -9; continue; } if (strncmp(string, serial, sizeof(string)) != 0) { @@ -829,6 +832,9 @@ } } + if (error_string) { + ftdi_error_return_free_device_list(error_code,error_string,devs); + } // device not found ftdi_error_return_free_device_list(-3, "device not found", devs); } @@ -3475,7 +3481,7 @@ i = 0x40; } if ((ftdi->type == TYPE_230X) && (i >= 0x40) && (i < 0x50)) { - uint16_t data; + uint16_t data = 0; if (ftdi_read_eeprom_location(ftdi, i, &data)) { fprintf(stderr, "Reading Factory Configuration Data failed\n"); i = 0x50; -- libftdi - see http://www.intra2net.com/en/developer/libftdi for details. To unsubscribe send a mail to libftdi+unsubscr...@developer.intra2net.com