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)
committerArve Hjønnevåg <arve@android.com>
Mon, 8 Feb 2010 23:09:00 +0000 (15:09 -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 d05397ec8a183ebb4467b10f55fe9b67e1cce189..9c333f1cc62a5626c1537f7b4d5a9a682b895b3f 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)