<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">ChangeSet 1.1525.6.6, 2003/07/01 13:45:23-07:00, lkml001@vrfy.org

[PATCH] USB: usb-skeleton.c usb_buffer_free() not called

dev-&gt;udev was set to NULL to indicate a device disconnect but we need
this value for usb_buffer_free() when device is still opened and cleanup is
delayed until skel_release().
I've added a dev-&gt;present for preventing device read, write and ioctl.
Also URB_NO_DMA_MAP is changed to URB_NO_TRANSFER_DMA_MAP and a unused
var is removed.


 drivers/usb/usb-skeleton.c |   22 +++++++++++++---------
 1 files changed, 13 insertions(+), 9 deletions(-)


diff -Nru a/drivers/usb/usb-skeleton.c b/drivers/usb/usb-skeleton.c
--- a/drivers/usb/usb-skeleton.c	Tue Jul  1 14:22:21 2003
+++ b/drivers/usb/usb-skeleton.c	Tue Jul  1 14:22:21 2003
@@ -112,6 +112,7 @@
 	struct completion	write_finished;		/* wait for the write to finish */
 
 	int			open;			/* if the port is open or not */
+	int			present;		/* if the device is not disconnected */
 	struct semaphore	sem;			/* locks this structure */
 };
 
@@ -296,7 +297,7 @@
 
 	dev-&gt;open = 0;
 
-	if (dev-&gt;udev == NULL) {
+	if (!dev-&gt;present) {
 		/* the device was unplugged before the file was released */
 		up (&amp;dev-&gt;sem);
 		skel_delete (dev);
@@ -326,7 +327,7 @@
 	down (&amp;dev-&gt;sem);
 
 	/* verify that the device wasn't unplugged */
-	if (dev-&gt;udev == NULL) {
+	if (!dev-&gt;present) {
 		up (&amp;dev-&gt;sem);
 		return -ENODEV;
 	}
@@ -382,7 +383,7 @@
 	down (&amp;dev-&gt;sem);
 
 	/* verify that the device wasn't unplugged */
-	if (dev-&gt;udev == NULL) {
+	if (!dev-&gt;present) {
 		retval = -ENODEV;
 		goto exit;
 	}
@@ -452,7 +453,7 @@
 	down (&amp;dev-&gt;sem);
 
 	/* verify that the device wasn't unplugged */
-	if (dev-&gt;udev == NULL) {
+	if (!dev-&gt;present) {
 		up (&amp;dev-&gt;sem);
 		return -ENODEV;
 	}
@@ -507,8 +508,6 @@
 	size_t buffer_size;
 	int i;
 	int retval;
-	char name[14];
-
 
 	/* See if the device offered us matches what we can accept */
 	if ((udev-&gt;descriptor.idVendor != USB_SKEL_VENDOR_ID) ||
@@ -580,7 +579,7 @@
 			 */
 			buffer_size = endpoint-&gt;wMaxPacketSize;
 			dev-&gt;bulk_out_size = buffer_size;
-			dev-&gt;write_urb-&gt;transfer_flags = (URB_NO_DMA_MAP |
+			dev-&gt;write_urb-&gt;transfer_flags = (URB_NO_TRANSFER_DMA_MAP |
 					URB_ASYNC_UNLINK);
 			dev-&gt;bulk_out_buffer = usb_buffer_alloc (udev,
 					buffer_size, GFP_KERNEL,
@@ -601,6 +600,9 @@
 		goto error;
 	}
 
+	/* allow device read, write and ioctl */
+	dev-&gt;present = 1;
+
 	/* let the user know what node this device is now attached to */
 	info ("USB Skeleton device now attached to USBSkel-%d", dev-&gt;minor);
 
@@ -663,10 +665,12 @@
 		wait_for_completion (&amp;dev-&gt;write_finished);
 	}
 
-	dev-&gt;udev = NULL;
+	/* prevent device read, write and ioctl */
+	dev-&gt;present = 0;
+
 	up (&amp;dev-&gt;sem);
 
-	/* if the device is not opened, then we clean up right now */
+	/* if the device is opened, skel_release will clean this up */
 	if (!dev-&gt;open)
 		skel_delete (dev);
 
</pre></body></html>