svn commit: r215983 - stable/8/lib/libusb

Andrew Thompson thompsa at FreeBSD.org
Sun Nov 28 07:18:15 UTC 2010


Author: thompsa
Date: Sun Nov 28 07:18:14 2010
New Revision: 215983
URL: http://svn.freebsd.org/changeset/base/215983

Log:
  MFC r215253
  
   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.

Modified:
  stable/8/lib/libusb/libusb10.c
  stable/8/lib/libusb/libusb10_io.c
Directory Properties:
  stable/8/lib/libusb/   (props changed)
  stable/8/lib/libusb/usb.h   (props changed)

Modified: stable/8/lib/libusb/libusb10.c
==============================================================================
--- stable/8/lib/libusb/libusb10.c	Sun Nov 28 07:16:53 2010	(r215982)
+++ stable/8/lib/libusb/libusb10.c	Sun Nov 28 07:18:14 2010	(r215983)
@@ -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: stable/8/lib/libusb/libusb10_io.c
==============================================================================
--- stable/8/lib/libusb/libusb10_io.c	Sun Nov 28 07:16:53 2010	(r215982)
+++ stable/8/lib/libusb/libusb10_io.c	Sun Nov 28 07:18:14 2010	(r215983)
@@ -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-all mailing list