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:
parent
3c6da8d2b0
commit
ef73c41207
35
usbshm.c
35
usbshm.c
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue