aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/core/config.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/core/config.c')
-rw-r--r--drivers/usb/core/config.c9
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);