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

USB: check for hub driver not bound to root hub device

This patch (as1267) changes usb_kick_khubd() and hdev_to_hub() to make
them more resilient against situations where a hub device isn't bound
to the hub driver.  The code assumes that if a root hub was
successfully registered then it must be bound to the hub driver.

But this assumption can fail if the user manually unbinds the hub
driver, or more importantly, if the host controller dies causing
usb_set_configuration to fail.

To protect against these possibilities, make hdev_to_hub() check that
the hub device is configured before dereferencing the active
configuration, and make usb_kick_khubd() check that the pointer to the
hub's private data structure isn't NULL.
Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 81e5b23c
...@@ -163,8 +163,10 @@ static inline char *portspeed(int portstatus) ...@@ -163,8 +163,10 @@ static inline char *portspeed(int portstatus)
} }
/* Note that hdev or one of its children must be locked! */ /* Note that hdev or one of its children must be locked! */
static inline struct usb_hub *hdev_to_hub(struct usb_device *hdev) static struct usb_hub *hdev_to_hub(struct usb_device *hdev)
{ {
if (!hdev || !hdev->actconfig)
return NULL;
return usb_get_intfdata(hdev->actconfig->interface[0]); return usb_get_intfdata(hdev->actconfig->interface[0]);
} }
...@@ -385,8 +387,10 @@ static void kick_khubd(struct usb_hub *hub) ...@@ -385,8 +387,10 @@ static void kick_khubd(struct usb_hub *hub)
void usb_kick_khubd(struct usb_device *hdev) void usb_kick_khubd(struct usb_device *hdev)
{ {
/* FIXME: What if hdev isn't bound to the hub driver? */ struct usb_hub *hub = hdev_to_hub(hdev);
kick_khubd(hdev_to_hub(hdev));
if (hub)
kick_khubd(hub);
} }
......
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