drivers: usb: gadget: handle NULL descriptors in composite config_buf
authorJared Suttles <jared.suttles@motorola.com>
Thu, 30 Jul 2009 21:13:27 +0000 (16:13 -0500)
committerColin Cross <ccross@android.com>
Thu, 30 Sep 2010 00:49:15 +0000 (17:49 -0700)
This fixes a problem in enumeration after a gadget function is removed.

Submitted on behalf of RaviKumar Vembu <ravi.v@motorola.com>

Signed-off-by: Jared Suttles <jared.suttles@motorola.com>
Signed-off-by: Mike Lockwood <lockwood@android.com>
drivers/usb/gadget/composite.c

index 1160c55de7f280122038aa21ee063ac1cfa06cb3..65012ff1c2ed62c9f8624fccc9b84dfbf8195f83 100644 (file)
@@ -236,6 +236,7 @@ static int config_buf(struct usb_configuration *config,
        int                             len = USB_BUFSIZ - USB_DT_CONFIG_SIZE;
        struct usb_function             *f;
        int                             status;
+       int                             interfaceCount = 0;
 
        /* write the config descriptor */
        c = buf;
@@ -266,8 +267,16 @@ static int config_buf(struct usb_configuration *config,
                        descriptors = f->hs_descriptors;
                else
                        descriptors = f->descriptors;
-               if (!descriptors)
+               if (!descriptors || descriptors[0] == NULL) {
+                       for (; f != config->interface[interfaceCount];) {
+                               interfaceCount++;
+                               c->bNumInterfaces--;
+                       }
                        continue;
+               }
+               for (; f != config->interface[interfaceCount];)
+                       interfaceCount++;
+
                status = usb_descriptor_fillbuf(next, len,
                        (const struct usb_descriptor_header **) descriptors);
                if (status < 0)