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)
committermgross <mark.gross@intel.com>
Wed, 9 Nov 2011 20:02:36 +0000 (12:02 -0800)
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 5cbb1a4..a1a54b4 100644 (file)
@@ -240,6 +240,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;
@@ -270,8 +271,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)