diff options
-rw-r--r-- | drivers/usb/core/config.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c index 55b198ba629b..93b38471754e 100644 --- a/drivers/usb/core/config.c +++ b/drivers/usb/core/config.c | |||
@@ -764,18 +764,21 @@ void usb_destroy_configuration(struct usb_device *dev) | |||
764 | return; | 764 | return; |
765 | 765 | ||
766 | if (dev->rawdescriptors) { | 766 | if (dev->rawdescriptors) { |
767 | for (i = 0; i < dev->descriptor.bNumConfigurations; i++) | 767 | for (i = 0; i < dev->descriptor.bNumConfigurations && |
768 | i < USB_MAXCONFIG; i++) | ||
768 | kfree(dev->rawdescriptors[i]); | 769 | kfree(dev->rawdescriptors[i]); |
769 | 770 | ||
770 | kfree(dev->rawdescriptors); | 771 | kfree(dev->rawdescriptors); |
771 | dev->rawdescriptors = NULL; | 772 | dev->rawdescriptors = NULL; |
772 | } | 773 | } |
773 | 774 | ||
774 | for (c = 0; c < dev->descriptor.bNumConfigurations; c++) { | 775 | for (c = 0; c < dev->descriptor.bNumConfigurations && |
776 | c < USB_MAXCONFIG; c++) { | ||
775 | struct usb_host_config *cf = &dev->config[c]; | 777 | struct usb_host_config *cf = &dev->config[c]; |
776 | 778 | ||
777 | kfree(cf->string); | 779 | kfree(cf->string); |
778 | for (i = 0; i < cf->desc.bNumInterfaces; i++) { | 780 | for (i = 0; i < cf->desc.bNumInterfaces && |
781 | i < USB_MAXINTERFACES; i++) { | ||
779 | if (cf->intf_cache[i]) | 782 | if (cf->intf_cache[i]) |
780 | kref_put(&cf->intf_cache[i]->ref, | 783 | kref_put(&cf->intf_cache[i]->ref, |
781 | usb_release_interface_cache); | 784 | usb_release_interface_cache); |