ChangeSet 1.1455.1.29, 2003/07/15 14:59:26-07:00, [EMAIL PROTECTED]
[PATCH] USB: fix race between open() and probe()
registering the device before setting the interface data can lead
to a null pointer being followed in open(). This patch fixes that.
drivers/usb/class/usblp.c | 34 +++++++++++++++++-----------------
1 files changed, 17 insertions(+), 17 deletions(-)
diff -Nru a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c
--- a/drivers/usb/class/usblp.c Thu Jul 17 17:04:08 2003
+++ b/drivers/usb/class/usblp.c Thu Jul 17 17:04:08 2003
@@ -833,22 +833,15 @@
init_waitqueue_head(&usblp->wait);
usblp->ifnum = intf->altsetting->desc.bInterfaceNumber;
- retval = usb_register_dev(intf, &usblp_class);
- if (retval) {
- err("Not able to get a minor for this device.");
- goto abort;
- }
- usblp->minor = intf->minor;
-
usblp->writeurb = usb_alloc_urb(0, GFP_KERNEL);
if (!usblp->writeurb) {
err("out of memory");
- goto abort_minor;
+ goto abort;
}
usblp->readurb = usb_alloc_urb(0, GFP_KERNEL);
if (!usblp->readurb) {
err("out of memory");
- goto abort_minor;
+ goto abort;
}
/* Malloc device ID string buffer to the largest expected length,
@@ -856,7 +849,7 @@
* could change in length. */
if (!(usblp->device_id_string = kmalloc(USBLP_DEVICE_ID_SIZE, GFP_KERNEL))) {
err("out of memory for device_id_string");
- goto abort_minor;
+ goto abort;
}
usblp->writebuf = usblp->readbuf = NULL;
@@ -868,19 +861,19 @@
if (!(usblp->writebuf = usb_buffer_alloc(dev, USBLP_BUF_SIZE,
GFP_KERNEL, &usblp->writeurb->transfer_dma))) {
err("out of memory for write buf");
- goto abort_minor;
+ goto abort;
}
if (!(usblp->readbuf = usb_buffer_alloc(dev, USBLP_BUF_SIZE,
GFP_KERNEL, &usblp->readurb->transfer_dma))) {
err("out of memory for read buf");
- goto abort_minor;
+ goto abort;
}
/* Allocate buffer for printer status */
usblp->statusbuf = kmalloc(STATUS_BUF_SIZE, GFP_KERNEL);
if (!usblp->statusbuf) {
err("out of memory for statusbuf");
- goto abort_minor;
+ goto abort;
}
/* Lookup quirks for this printer. */
@@ -894,12 +887,12 @@
dbg("incompatible printer-class device 0x%4.4X/0x%4.4X",
dev->descriptor.idVendor,
dev->descriptor.idProduct);
- goto abort_minor;
+ goto abort;
}
/* Setup the selected alternate setting and endpoints. */
if (usblp_set_protocol(usblp, protocol) < 0)
- goto abort_minor;
+ goto abort;
/* Retrieve and store the device ID string. */
usblp_cache_device_id_string(usblp);
@@ -920,10 +913,17 @@
usblp->present = 1;
+ retval = usb_register_dev(intf, &usblp_class);
+ if (retval) {
+ err("Not able to get a minor for this device.");
+ goto abort_intfdata;
+ }
+ usblp->minor = intf->minor;
+
return 0;
-abort_minor:
- usb_deregister_dev(intf, &usblp_class);
+abort_intfdata:
+ usb_set_intfdata (intf, NULL);
abort:
if (usblp) {
if (usblp->writebuf)
-------------------------------------------------------
This SF.net email is sponsored by: VM Ware
With VMware you can run multiple operating systems on a single machine.
WITHOUT REBOOTING! Mix Linux / Windows / Novell virtual machines at the
same time. Free trial click here: http://www.vmware.com/wl/offer/345/0
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel