USB: hub: fix SS hub-descriptor handling
commit 2c25a2c818023df64463aac3288a9f969491e507 upstream.
A SuperSpeed hub descriptor does not have any variable-length fields so
bail out when reading a short descriptor.
This avoids parsing and leaking two bytes of uninitialised slab data
through sysfs removable-attributes.
Fixes: dbe79bbe9d
("USB 3.0 Hub Changes")
Cc: John Youn <John.Youn@synopsys.com>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
1e6e9c4c36
commit
af4e234024
1 changed files with 6 additions and 2 deletions
|
@ -376,8 +376,12 @@ static int get_hub_descriptor(struct usb_device *hdev, void *data)
|
||||||
USB_REQ_GET_DESCRIPTOR, USB_DIR_IN | USB_RT_HUB,
|
USB_REQ_GET_DESCRIPTOR, USB_DIR_IN | USB_RT_HUB,
|
||||||
dtype << 8, 0, data, size,
|
dtype << 8, 0, data, size,
|
||||||
USB_CTRL_GET_TIMEOUT);
|
USB_CTRL_GET_TIMEOUT);
|
||||||
if (ret >= (USB_DT_HUB_NONVAR_SIZE + 2))
|
if (hub_is_superspeed(hdev)) {
|
||||||
|
if (ret == size)
|
||||||
|
return ret;
|
||||||
|
} else if (ret >= (USB_DT_HUB_NONVAR_SIZE + 2)) {
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -1303,7 +1307,7 @@ static int hub_configure(struct usb_hub *hub,
|
||||||
|
|
||||||
/* Request the entire hub descriptor.
|
/* Request the entire hub descriptor.
|
||||||
* hub->descriptor can handle USB_MAXCHILDREN ports,
|
* hub->descriptor can handle USB_MAXCHILDREN ports,
|
||||||
* but the hub can/will return fewer bytes here.
|
* but a (non-SS) hub can/will return fewer bytes here.
|
||||||
*/
|
*/
|
||||||
ret = get_hub_descriptor(hdev, hub->descriptor);
|
ret = get_hub_descriptor(hdev, hub->descriptor);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue