ChangeSet 1.831.15.10, 2002/12/09 10:05:28-08:00, oliver@oenone.homelinux.org

[PATCH] USB usbfs: fix race between disconnect and usbdev_open



diff -Nru a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
--- a/drivers/usb/core/devio.c	Mon Dec  9 11:41:16 2002
+++ b/drivers/usb/core/devio.c	Mon Dec  9 11:41:16 2002
@@ -484,14 +484,17 @@
 	 * and the hub thread have the kernel lock
 	 * (still acquire the kernel lock for safety)
 	 */
+	ret = -ENOMEM;
+	if (!(ps = kmalloc(sizeof(struct dev_state), GFP_KERNEL)))
+		goto out_nolock;
+
 	lock_kernel();
 	ret = -ENOENT;
 	dev = inode->u.generic_ip;
-	if (!dev)
-		goto out;
-	ret = -ENOMEM;
-	if (!(ps = kmalloc(sizeof(struct dev_state), GFP_KERNEL)))
+	if (!dev) {
+		kfree(ps);
 		goto out;
+	}
 	ret = 0;
 	ps->dev = dev;
 	ps->file = file;
@@ -509,6 +512,7 @@
 	file->private_data = ps;
  out:
 	unlock_kernel();
+ out_nolock:
         return ret;
 }
 
