diff --git a/src/usb.c b/src/usb.c index 87a1061..e39bc48 100644 --- a/src/usb.c +++ b/src/usb.c @@ -513,10 +513,12 @@ dc_usb_read (dc_iostream_t *abstract, void *data, size_t size, size_t *actual) int nbytes = 0; int rc = libusb_bulk_transfer (usb->handle, usb->endpoint_in, data, size, &nbytes, usb->timeout); - if (rc != LIBUSB_SUCCESS) { + if (rc != LIBUSB_SUCCESS || nbytes < 0) { ERROR (abstract->context, "Usb read bulk transfer failed (%s).", libusb_error_name (rc)); status = syserror (rc); + if (nbytes < 0) + nbytes = 0; goto out; } @@ -535,10 +537,12 @@ dc_usb_write (dc_iostream_t *abstract, const void *data, size_t size, size_t *ac int nbytes = 0; int rc = libusb_bulk_transfer (usb->handle, usb->endpoint_out, (void *) data, size, &nbytes, 0); - if (rc != LIBUSB_SUCCESS) { + if (rc != LIBUSB_SUCCESS || nbytes < 0) { ERROR (abstract->context, "Usb write bulk transfer failed (%s).", libusb_error_name (rc)); status = syserror (rc); + if (nbytes < 0) + nbytes = 0; goto out; } diff --git a/src/usbhid.c b/src/usbhid.c index b16bcc3..735ceef 100644 --- a/src/usbhid.c +++ b/src/usbhid.c @@ -703,10 +703,12 @@ dc_usbhid_read (dc_iostream_t *abstract, void *data, size_t size, size_t *actual #if defined(USE_LIBUSB) int rc = libusb_interrupt_transfer (usbhid->handle, usbhid->endpoint_in, data, size, &nbytes, usbhid->timeout); - if (rc != LIBUSB_SUCCESS) { + if (rc != LIBUSB_SUCCESS || nbytes < 0) { ERROR (abstract->context, "Usb read interrupt transfer failed (%s).", libusb_error_name (rc)); status = syserror (rc); + if (nbytes < 0) + nbytes = 0; goto out; } #elif defined(USE_HIDAPI) @@ -749,10 +751,12 @@ dc_usbhid_write (dc_iostream_t *abstract, const void *data, size_t size, size_t } int rc = libusb_interrupt_transfer (usbhid->handle, usbhid->endpoint_out, (void *) buffer, length, &nbytes, 0); - if (rc != LIBUSB_SUCCESS) { + if (rc != LIBUSB_SUCCESS || nbytes < 0) { ERROR (abstract->context, "Usb write interrupt transfer failed (%s).", libusb_error_name (rc)); status = syserror (rc); + if (nbytes < 0) + nbytes = 0; goto out; }