diff options
Diffstat (limited to 'common/usb_hub.c')
| -rw-r--r-- | common/usb_hub.c | 14 | 
1 files changed, 4 insertions, 10 deletions
| diff --git a/common/usb_hub.c b/common/usb_hub.c index fd2b4ed4f..ffac0e743 100644 --- a/common/usb_hub.c +++ b/common/usb_hub.c @@ -306,7 +306,7 @@ void usb_hub_port_connect_change(struct usb_device *dev, int port)  static int usb_hub_configure(struct usb_device *dev)  { -	int i; +	int i, length;  	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, USB_BUFSIZ);  	unsigned char *bitmap;  	short hubCharacteristics; @@ -327,20 +327,14 @@ static int usb_hub_configure(struct usb_device *dev)  	}  	descriptor = (struct usb_hub_descriptor *)buffer; -	/* silence compiler warning if USB_BUFSIZ is > 256 [= sizeof(char)] */ -	i = descriptor->bLength; -	if (i > USB_BUFSIZ) { -		debug("usb_hub_configure: failed to get hub " \ -		      "descriptor - too long: %d\n", descriptor->bLength); -		return -1; -	} +	length = min(descriptor->bLength, sizeof(struct usb_hub_descriptor)); -	if (usb_get_hub_descriptor(dev, buffer, descriptor->bLength) < 0) { +	if (usb_get_hub_descriptor(dev, buffer, length) < 0) {  		debug("usb_hub_configure: failed to get hub " \  		      "descriptor 2nd giving up %lX\n", dev->status);  		return -1;  	} -	memcpy((unsigned char *)&hub->desc, buffer, descriptor->bLength); +	memcpy((unsigned char *)&hub->desc, buffer, length);  	/* adjust 16bit values */  	put_unaligned(le16_to_cpu(get_unaligned(  			&descriptor->wHubCharacteristics)), |