Commit 00ee59a3 authored by Alan Stern's avatar Alan Stern Committed by Greg Kroah-Hartman

[PATCH] USB: Don't delete interfaces until all are unbound

On Thu, 13 May 2004, Duncan Sands wrote:

> No, but the pointer for another (previous) interface may just have been
> set to NULL, causing an Oops when usb_ifnum_to_if loops over all
> interfaces.

Of course!  I trust you won't mind me changing your suggested fix
slightly.  This should do an equally good job of repairing things, and it
will prevent other possible invalid references as well.
parent 79560d5a
...@@ -830,7 +830,14 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0) ...@@ -830,7 +830,14 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0)
interface = dev->actconfig->interface[i]; interface = dev->actconfig->interface[i];
dev_dbg (&dev->dev, "unregistering interface %s\n", dev_dbg (&dev->dev, "unregistering interface %s\n",
interface->dev.bus_id); interface->dev.bus_id);
device_unregister (&interface->dev); device_del (&interface->dev);
}
/* Now that the interfaces are unbound, nobody should
* try to access them.
*/
for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) {
put_device (&dev->actconfig->interface[i]->dev);
dev->actconfig->interface[i] = NULL; dev->actconfig->interface[i] = NULL;
} }
dev->actconfig = 0; dev->actconfig = 0;
......
...@@ -198,6 +198,9 @@ void usb_deregister(struct usb_driver *driver) ...@@ -198,6 +198,9 @@ void usb_deregister(struct usb_driver *driver)
* This routine helps device drivers avoid such mistakes. * This routine helps device drivers avoid such mistakes.
* However, you should make sure that you do the right thing with any * However, you should make sure that you do the right thing with any
* alternate settings available for this interfaces. * alternate settings available for this interfaces.
*
* Don't call this function unless you are bound to one of the interfaces
* on this device or you own the dev->serialize semaphore!
*/ */
struct usb_interface *usb_ifnum_to_if(struct usb_device *dev, unsigned ifnum) struct usb_interface *usb_ifnum_to_if(struct usb_device *dev, unsigned ifnum)
{ {
...@@ -228,6 +231,9 @@ struct usb_interface *usb_ifnum_to_if(struct usb_device *dev, unsigned ifnum) ...@@ -228,6 +231,9 @@ struct usb_interface *usb_ifnum_to_if(struct usb_device *dev, unsigned ifnum)
* it would be incorrect to assume that the first altsetting entry in * it would be incorrect to assume that the first altsetting entry in
* the array corresponds to altsetting zero. This routine helps device * the array corresponds to altsetting zero. This routine helps device
* drivers avoid such mistakes. * drivers avoid such mistakes.
*
* Don't call this function unless you are bound to the intf interface
* or you own the device's ->serialize semaphore!
*/ */
struct usb_host_interface *usb_altnum_to_altsetting(struct usb_interface *intf, struct usb_host_interface *usb_altnum_to_altsetting(struct usb_interface *intf,
unsigned int altnum) unsigned int altnum)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment