svn commit: r215253 - head/lib/libusb
Hans Petter Selasky
hselasky at FreeBSD.org
Sat Nov 13 19:25:11 UTC 2010
Author: hselasky
Date: Sat Nov 13 19:25:11 2010
New Revision: 215253
URL: http://svn.freebsd.org/changeset/base/215253
Log:
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)
Modified:
head/lib/libusb/libusb10.c
head/lib/libusb/libusb10_io.c
Modified: head/lib/libusb/libusb10.c
==============================================================================
--- head/lib/libusb/libusb10.c Sat Nov 13 18:39:24 2010 (r215252)
+++ head/lib/libusb/libusb10.c Sat Nov 13 19:25:11 2010 (r215253)
@@ -800,6 +800,10 @@ libusb_free_transfer(struct libusb_trans
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));
Modified: head/lib/libusb/libusb10_io.c
==============================================================================
--- head/lib/libusb/libusb10_io.c Sat Nov 13 18:39:24 2010 (r215252)
+++ head/lib/libusb/libusb10_io.c Sat Nov 13 19:25:11 2010 (r215253)
@@ -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);
More information about the svn-src-head
mailing list