From 38b6382c5adf86407403988df0d73ec0ebffa553 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Tue, 16 Oct 2012 16:58:36 -0700 Subject: [PATCH] Add a guard for stream data file read/write, to ensure fd is valid. --- host/usb_test/usb_test.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/host/usb_test/usb_test.c b/host/usb_test/usb_test.c index 33bc9979..52b8b7af 100644 --- a/host/usb_test/usb_test.c +++ b/host/usb_test/usb_test.c @@ -53,8 +53,16 @@ volatile uint32_t byte_count = 0; void write_callback(struct libusb_transfer* transfer) { if( transfer->status == LIBUSB_TRANSFER_COMPLETED ) { byte_count += transfer->actual_length; - write(fd, transfer->buffer, transfer->actual_length); - libusb_submit_transfer(transfer); + if( fd != -1 ) { + const ssize_t bytes_written = write(fd, transfer->buffer, transfer->actual_length); + if( bytes_written == transfer->actual_length ) { + libusb_submit_transfer(transfer); + } else { + printf("write failed: errno %d\n", errno); + close(fd); + fd = -1; + } + } } else { printf("transfer status was not 'completed'\n"); } @@ -63,8 +71,16 @@ void write_callback(struct libusb_transfer* transfer) { void read_callback(struct libusb_transfer* transfer) { if( transfer->status == LIBUSB_TRANSFER_COMPLETED ) { byte_count += transfer->actual_length; - read(fd, transfer->buffer, transfer->actual_length); - libusb_submit_transfer(transfer); + if( fd != -1 ) { + const ssize_t bytes_read = read(fd, transfer->buffer, transfer->length); + if( bytes_read == transfer->length ) { + libusb_submit_transfer(transfer); + } else { + printf("read failed: errno %d\n", errno); + close(fd); + fd = -1; + } + } } else { printf("transfer status was not 'completed'\n"); }