ChangeSet 1.811.1.17, 2002/12/16 11:55:30-08:00, jkt@Helius.COM

[PATCH] uhci corruption on usb_submit_urb when already -EINPROGRESS

  uhci corrupts a list, either uhci->urb_list or uhci->urb_remove_list,
  when usb_submit_urb is called against an urb already in flight
  (urb->status == -EINPROGRESS).  yeah, i know you're not *supposed* to do
  that but Real Programmers(tm) make Real Mistakes(tm) (and timeouts are
  oh, so tricky!) and the code catches this case otherwise; unfortunately,
  the INIT_LIST_HEAD has already hammered your list.

  :{)}


diff -Nru a/drivers/usb/uhci.c b/drivers/usb/uhci.c
--- a/drivers/usb/uhci.c	Mon Dec 16 16:33:47 2002
+++ b/drivers/usb/uhci.c	Mon Dec 16 16:33:47 2002
@@ -1498,7 +1498,6 @@
 
 	uhci = (struct uhci *)urb->dev->bus->hcpriv;
 
-	INIT_LIST_HEAD(&urb->urb_list);
 	usb_inc_dev_use(urb->dev);
 
 	spin_lock_irqsave(&uhci->urb_list_lock, flags);
@@ -1515,6 +1514,7 @@
 		return ret;
 	}
 
+    INIT_LIST_HEAD(&urb->urb_list);
 	if (!uhci_alloc_urb_priv(uhci, urb)) {
 		ret = -ENOMEM;
 
