summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/usb_parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/usb/usb_parse.c')
-rw-r--r--sys/dev/usb/usb_parse.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/sys/dev/usb/usb_parse.c b/sys/dev/usb/usb_parse.c
index 884bd05..deb52ea 100644
--- a/sys/dev/usb/usb_parse.c
+++ b/sys/dev/usb/usb_parse.c
@@ -215,20 +215,29 @@ usbd_get_no_descriptors(struct usb_config_descriptor *cd, uint8_t type)
* usbd_get_no_alts
*
* Return value:
- * Number of alternate settings for the given interface descriptor pointer.
+ * Number of alternate settings for the given interface descriptor
+ * pointer. If the USB descriptor is corrupt, the returned value can
+ * be greater than the actual number of alternate settings.
*------------------------------------------------------------------------*/
uint8_t
usbd_get_no_alts(struct usb_config_descriptor *cd,
struct usb_interface_descriptor *id)
{
struct usb_descriptor *desc;
- uint8_t n = 0;
+ uint8_t n;
uint8_t ifaceno;
+ /* Reset interface count */
+
+ n = 0;
+
+ /* Get the interface number */
+
ifaceno = id->bInterfaceNumber;
- desc = (struct usb_descriptor *)id;
+ /* Iterate all the USB descriptors */
+ desc = NULL;
while ((desc = usb_desc_foreach(cd, desc))) {
if ((desc->bDescriptorType == UDESC_INTERFACE) &&
(desc->bLength >= sizeof(*id))) {
@@ -237,8 +246,7 @@ usbd_get_no_alts(struct usb_config_descriptor *cd,
n++;
if (n == 0xFF)
break; /* crazy */
- } else
- break; /* end */
+ }
}
}
return (n);
OpenPOWER on IntegriCloud