Browse Source

lib: abort if submitting transfer fails, don't deadlock when cancelling fails

Signed-off-by: Steve Markgraf <steve@steve-m.de>
Steve Markgraf 11 years ago
parent
commit
d683b128f9
1 changed files with 10 additions and 2 deletions
  1. 10 2
      src/librtlsdr.c

+ 10 - 2
src/librtlsdr.c

@@ -1760,7 +1760,12 @@ int rtlsdr_read_async(rtlsdr_dev_t *dev, rtlsdr_read_async_cb_t cb, void *ctx,
 					  (void *)dev,
 					  BULK_TIMEOUT);
 
-		libusb_submit_transfer(dev->xfer[i]);
+		r = libusb_submit_transfer(dev->xfer[i]);
+		if (r < 0) {
+			fprintf(stderr, "Failed to submit transfer %i!\n", i);
+			dev->async_status = RTLSDR_CANCELING;
+			break;
+		}
 	}
 
 	while (RTLSDR_INACTIVE != dev->async_status) {
@@ -1784,7 +1789,10 @@ int rtlsdr_read_async(rtlsdr_dev_t *dev, rtlsdr_read_async_cb_t cb, void *ctx,
 
 				if (LIBUSB_TRANSFER_CANCELLED !=
 						dev->xfer[i]->status) {
-					libusb_cancel_transfer(dev->xfer[i]);
+					r = libusb_cancel_transfer(dev->xfer[i]);
+					if (r < 0)
+						continue;
+
 					next_status = RTLSDR_CANCELING;
 				}
 			}