[U-Boot] [PATCH] usb: fallback safely when a configuration descriptor is too large
Simon Glass
sjg at chromium.org
Wed Jul 25 09:46:38 CEST 2012
Hi Vincent,
On Tue, Jul 24, 2012 at 6:12 PM, Vincent Palatin <vpalatin at chromium.org> wrote:
> When a USB configuration descriptor was larger than our USB buffer
> (512 bytes), we were skipping the full descriptor reading but then we
> were still parsing and using it, triggering memory corruptions.
> Now in that case, it just skips this device enumeration and displays the
> appropriate message to the user, so he can fix the buffer if he wants.
>
> This bug was triggered by some UVC webcams which have very large
> configuration descriptors (e.g. a couple of kB) describing all their
> supported video encodings.
>
> Signed-off-by: Vincent Palatin <vpalatin at chromium.org>
Acked-by: Simon Glass <sjg at chromium.org>
> ---
> common/usb.c | 12 +++++++++---
> 1 files changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/common/usb.c b/common/usb.c
> index 63a11c8..cfa1ad7 100644
> --- a/common/usb.c
> +++ b/common/usb.c
> @@ -485,8 +485,8 @@ int usb_get_configuration_no(struct usb_device *dev,
> tmp = le16_to_cpu(config->wTotalLength);
>
> if (tmp > USB_BUFSIZ) {
> - USB_PRINTF("usb_get_configuration_no: failed to get " \
> - "descriptor - too long: %d\n", tmp);
> + printf("usb_get_configuration_no: failed to get " \
> + "descriptor - too long: %d\n", tmp);
Should this (and the one below) be USB_PRINTF() instead?
> return -1;
> }
>
> @@ -921,7 +921,13 @@ int usb_new_device(struct usb_device *dev)
> le16_to_cpus(&dev->descriptor.idProduct);
> le16_to_cpus(&dev->descriptor.bcdDevice);
> /* only support for one config for now */
> - usb_get_configuration_no(dev, &tmpbuf[0], 0);
> + err = usb_get_configuration_no(dev, &tmpbuf[0], 0);
> + if (err < 0) {
> + printf("usb_new_device: Cannot read configuration, " \
> + "skipping device %04x:%04x\n",
> + dev->descriptor.idVendor, dev->descriptor.idProduct);
> + return -1;
> + }
> usb_parse_config(dev, &tmpbuf[0], 0);
> usb_set_maxpacket(dev);
> /* we set the default configuration here */
> --
> 1.7.7.3
>
Regards,
Simon
More information about the U-Boot
mailing list