|
@@ -643,15 +643,23 @@ static int usb_parse_configuration(struct usb_device *dev, int cfgidx,
|
|
|
|
|
|
} else if (header->bDescriptorType ==
|
|
|
USB_DT_INTERFACE_ASSOCIATION) {
|
|
|
+ struct usb_interface_assoc_descriptor *d;
|
|
|
+
|
|
|
+ d = (struct usb_interface_assoc_descriptor *)header;
|
|
|
+ if (d->bLength < USB_DT_INTERFACE_ASSOCIATION_SIZE) {
|
|
|
+ dev_warn(ddev,
|
|
|
+ "config %d has an invalid interface association descriptor of length %d, skipping\n",
|
|
|
+ cfgno, d->bLength);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
if (iad_num == USB_MAXIADS) {
|
|
|
dev_warn(ddev, "found more Interface "
|
|
|
"Association Descriptors "
|
|
|
"than allocated for in "
|
|
|
"configuration %d\n", cfgno);
|
|
|
} else {
|
|
|
- config->intf_assoc[iad_num] =
|
|
|
- (struct usb_interface_assoc_descriptor
|
|
|
- *)header;
|
|
|
+ config->intf_assoc[iad_num] = d;
|
|
|
iad_num++;
|
|
|
}
|
|
|
|