summaryrefslogtreecommitdiffstats
path: root/lib/libusb
diff options
context:
space:
mode:
authorhselasky <hselasky@FreeBSD.org>2010-11-13 19:25:11 +0000
committerhselasky <hselasky@FreeBSD.org>2010-11-13 19:25:11 +0000
commit465cb0556af9e7d9eee39cb26ff5832329fa9d5f (patch)
treefc3692a2e1cc644599f47393564a242be0d4b2cd /lib/libusb
parent92ec3c18bd20ab5a94f95021ea99deeeeec77f32 (diff)
downloadFreeBSD-src-465cb0556af9e7d9eee39cb26ff5832329fa9d5f.zip
FreeBSD-src-465cb0556af9e7d9eee39cb26ff5832329fa9d5f.tar.gz
Fix LibUSB v1.0 compliancy.
1) We need to allow the USB callback to free the USB transfer itself. 2) The USB transfer buffer should only be automatically freed when freeing the USB transfer. Fixed by: hselasky Submitted by: Gustau Perez i Querol Approved by: thompsa (mentor)
Diffstat (limited to 'lib/libusb')
-rw-r--r--lib/libusb/libusb10.c4
-rw-r--r--lib/libusb/libusb10_io.c11
2 files changed, 11 insertions, 4 deletions
diff --git a/lib/libusb/libusb10.c b/lib/libusb/libusb10.c
index 5767cb2..3b8d567 100644
--- a/lib/libusb/libusb10.c
+++ b/lib/libusb/libusb10.c
@@ -800,6 +800,10 @@ libusb_free_transfer(struct libusb_transfer *uxfer)
if (uxfer == NULL)
return; /* be NULL safe */
+ /* check if we should free the transfer buffer */
+ if (uxfer->flags & LIBUSB_TRANSFER_FREE_BUFFER)
+ free(uxfer->buffer);
+
sxfer = (struct libusb_super_transfer *)(
(uint8_t *)uxfer - sizeof(*sxfer));
diff --git a/lib/libusb/libusb10_io.c b/lib/libusb/libusb10_io.c
index 48405c9..380e312 100644
--- a/lib/libusb/libusb10_io.c
+++ b/lib/libusb/libusb10_io.c
@@ -187,6 +187,8 @@ do_done:
/* Do all done callbacks */
while ((sxfer = TAILQ_FIRST(&ctx->tr_done))) {
+ uint8_t flags;
+
TAILQ_REMOVE(&ctx->tr_done, sxfer, entry);
sxfer->entry.tqe_prev = NULL;
@@ -197,13 +199,14 @@ do_done:
uxfer = (struct libusb_transfer *)(
((uint8_t *)sxfer) + sizeof(*sxfer));
+ /* Allow the callback to free the transfer itself. */
+ flags = uxfer->flags;
+
if (uxfer->callback != NULL)
(uxfer->callback) (uxfer);
- if (uxfer->flags & LIBUSB_TRANSFER_FREE_BUFFER)
- free(uxfer->buffer);
-
- if (uxfer->flags & LIBUSB_TRANSFER_FREE_TRANSFER)
+ /* Check if the USB transfer should be automatically freed. */
+ if (flags & LIBUSB_TRANSFER_FREE_TRANSFER)
libusb_free_transfer(uxfer);
CTX_LOCK(ctx);
OpenPOWER on IntegriCloud