The branch, master has been updated
via 90ef163e06dc90aebca58b8e4c99946392e37152 (commit)
from 82610092f71ea930e93a41d6b7741dc7dc4480db (commit)
- Log -----------------------------------------------------------------
commit 90ef163e06dc90aebca58b8e4c99946392e37152
Author: Yi-Shin Li <ysli@xxxxxxxxxxxxx>
Date: Sun Jul 11 23:08:11 2010 +0800
bug fix for async write and read
* In ftdi_write_data_cb(), the tc->offset should be accumulated with
transfer->actual_length.
* In ftdi_transfer_data_done(), the tc->transfer could be NULL if
"(size <= ftdi->readbuffer_remaining)" at ftdi_read_data_submit().
Therefore, has to check if it's NULL before accessing it.
-----------------------------------------------------------------------
Summary of changes:
src/ftdi.c | 27 ++++++++++++++++-----------
1 files changed, 16 insertions(+), 11 deletions(-)
diff --git a/src/ftdi.c b/src/ftdi.c
index b22a55b..af813f3 100644
--- a/src/ftdi.c
+++ b/src/ftdi.c
@@ -1322,9 +1322,9 @@ static void ftdi_write_data_cb(struct libusb_transfer
*transfer)
{
struct ftdi_transfer_control *tc = (struct ftdi_transfer_control *)
transfer->user_data;
struct ftdi_context *ftdi = tc->ftdi;
-
- tc->offset = transfer->actual_length;
-
+
+ tc->offset += transfer->actual_length;
+
if (tc->offset == tc->size)
{
tc->completed = 1;
@@ -1388,7 +1388,9 @@ struct ftdi_transfer_control
*ftdi_write_data_submit(struct ftdi_context *ftdi,
else
write_size = ftdi->writebuffer_chunksize;
- libusb_fill_bulk_transfer(transfer, ftdi->usb_dev, ftdi->in_ep, buf,
write_size, ftdi_write_data_cb, tc, ftdi->usb_write_timeout);
+ libusb_fill_bulk_transfer(transfer, ftdi->usb_dev, ftdi->in_ep, buf,
+ write_size, ftdi_write_data_cb, tc,
+ ftdi->usb_write_timeout);
transfer->type = LIBUSB_TRANSFER_TYPE_BULK;
ret = libusb_submit_transfer(transfer);
@@ -1514,17 +1516,20 @@ int ftdi_transfer_data_done(struct
ftdi_transfer_control *tc)
break;
libusb_free_transfer(tc->transfer);
free (tc);
- tc = NULL;
return ret;
}
}
- if (tc->transfer->status == LIBUSB_TRANSFER_COMPLETED)
- ret = tc->offset;
- else
- ret = -1;
-
- libusb_free_transfer(tc->transfer);
+ ret = tc->offset;
+ /**
+ * tc->transfer could be NULL if "(size <= ftdi->readbuffer_remaining)"
+ * at ftdi_read_data_submit(). Therefore, has to check it here.
+ **/
+ if (tc->transfer) {
+ if (tc->transfer->status != LIBUSB_TRANSFER_COMPLETED)
+ ret = -1;
+ libusb_free_transfer(tc->transfer);
+ }
free(tc);
return ret;
}
hooks/post-receive
--
port libftdi to libusb-1.0
--
libftdi-git - see http://www.intra2net.com/en/developer/libftdi for details.
To unsubscribe send a mail to libftdi-git+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx
|