From ef73c41207ff6dd35e6522852a6eea4b27e1b986 Mon Sep 17 00:00:00 2001 From: Carl Philipp Klemm Date: Tue, 20 Feb 2024 09:41:46 +0100 Subject: [PATCH] fix issue in usbshm where a open() with specific serial number would segfault if a unresponsive usb device is encountered --- usbshm.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/usbshm.c b/usbshm.c index 5b609c7..38c5074 100644 --- a/usbshm.c +++ b/usbshm.c @@ -124,32 +124,39 @@ int usbshm_open(struct usbshm* instance, int vendorID, int productID, const unsi if( count > 0) { struct libusb_device_descriptor desc = {0}; - for(int i = 0; i < count; ++i) + for(int i = 0; i < count; ++i) { libusb_get_device_descriptor(list[i], &desc); if(desc.idVendor == vendorID && desc.idProduct == productID) { errorCode = libusb_open(list[i], &instance->priv->handle) < 0 ? USBSHM_ERROR_ERR : 0; - if(serial) + if(errorCode != USBSHM_ERROR_ERR && instance->priv->handle) { - size_t len = strlen((const char*)serial)+1; - unsigned char* buffer = malloc(len); - buffer[0] = '\0'; - libusb_get_string_descriptor_ascii(instance->priv->handle, desc.iSerialNumber, buffer, len); - int cmp = strcmp((const char*)serial, (const char*)buffer); - free(buffer); - if(cmp != 0) + if(serial) { - libusb_close(instance->priv->handle); - instance->priv->handle = NULL; - continue; + size_t len = strlen((const char*)serial)+1; + unsigned char* buffer = malloc(len); + buffer[0] = '\0'; + libusb_get_string_descriptor_ascii(instance->priv->handle, desc.iSerialNumber, buffer, len); + int cmp = strcmp((const char*)serial, (const char*)buffer); + free(buffer); + if(cmp != 0) + { + libusb_close(instance->priv->handle); + instance->priv->handle = NULL; + continue; + } } + break; + } + else + { + instance->priv->handle = NULL; } - break; } } } - else + else { printf("Can not list devices\n"); pthread_mutex_unlock(libusbDataMutex);