fix issue in usbshm where a open() with specific serial number would segfault if a unresponsive usb device is encountered

This commit is contained in:
Carl Philipp Klemm 2024-02-20 09:41:46 +01:00
parent 3c6da8d2b0
commit ef73c41207

View file

@ -124,32 +124,39 @@ int usbshm_open(struct usbshm* instance, int vendorID, int productID, const unsi
if( count > 0) if( count > 0)
{ {
struct libusb_device_descriptor desc = {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); libusb_get_device_descriptor(list[i], &desc);
if(desc.idVendor == vendorID && desc.idProduct == productID) if(desc.idVendor == vendorID && desc.idProduct == productID)
{ {
errorCode = libusb_open(list[i], &instance->priv->handle) < 0 ? USBSHM_ERROR_ERR : 0; 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; if(serial)
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); size_t len = strlen((const char*)serial)+1;
instance->priv->handle = NULL; unsigned char* buffer = malloc(len);
continue; 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"); printf("Can not list devices\n");
pthread_mutex_unlock(libusbDataMutex); pthread_mutex_unlock(libusbDataMutex);