dm: usb: Avoid exceeding available array size for storage devices
authorSimon Glass <sjg@chromium.org>
Mon, 29 Feb 2016 22:25:53 +0000 (15:25 -0700)
committerSimon Glass <sjg@chromium.org>
Mon, 14 Mar 2016 21:34:50 +0000 (15:34 -0600)
The limit on storage devices is USB_MAX_STOR_DEV but we use one extra
element while probing to see if a device is a storage device. Avoid this,
since it causes memory corruption.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
Tested-by: Stephen Warren <swarren@nvidia.com>
common/usb_storage.c

index 60531e2aa486e33e83bc54dfbdcb021acdce9e0a..f2d2ad9fb240882a6778cef59b9dfacfe30e3389 100644 (file)
@@ -176,6 +176,13 @@ static int usb_stor_probe_device(struct usb_device *dev)
        if (dev == NULL)
                return -ENOENT; /* no more devices available */
 
+       /* We don't have space to even probe if we hit the maximum */
+       if (usb_max_devs == USB_MAX_STOR_DEV) {
+               printf("max USB Storage Device reached: %d stopping\n",
+                      usb_max_devs);
+               return -ENOSPC;
+       }
+
        debug("\n\nProbing for storage\n");
        if (usb_storage_probe(dev, 0, &usb_stor[usb_max_devs])) {
                /* OK, it's a storage device.  Iterate over its LUNs
@@ -210,13 +217,6 @@ static int usb_stor_probe_device(struct usb_device *dev)
                }
        }
 
-       /* if storage device */
-       if (usb_max_devs == USB_MAX_STOR_DEV) {
-               printf("max USB Storage Device reached: %d stopping\n",
-                      usb_max_devs);
-               return -ENOSPC;
-       }
-
        return 0;
 }