summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Konovalov <andreyknvl@google.com>2017-12-11 22:48:41 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-03-27 14:13:55 +0900
commit4a4aed9055e8e8e6e7becf10821d5f2e1c90c3a8 (patch)
tree79e7de30d3bbd5f928fdc1ee90dbc59fd2f55dca
parentaab86217763b06bcb563cb69dbbff8d598b52a39 (diff)
downloadlinux-4a4aed9055e8e8e6e7becf10821d5f2e1c90c3a8.tar.gz
linux-4a4aed9055e8e8e6e7becf10821d5f2e1c90c3a8.tar.bz2
linux-4a4aed9055e8e8e6e7becf10821d5f2e1c90c3a8.zip
USB: core: only clean up what we allocated
commit 32fd87b3bbf5f7a045546401dfe2894dbbf4d8c3 upstream. When cleaning up the configurations, make sure we only free the number of configurations and interfaces that we could have allocated. Reported-by: Andrey Konovalov <andreyknvl@google.com> Cc: stable <stable@vger.kernel.org> Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-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 bd749e78df59..1a6ccdd5a5fc 100644
--- a/drivers/usb/core/config.c
+++ b/drivers/usb/core/config.c
@@ -768,18 +768,21 @@ void usb_destroy_configuration(struct usb_device *dev)
return;
if (dev->rawdescriptors) {
- for (i = 0; i < dev->descriptor.bNumConfigurations; i++)
+ for (i = 0; i < dev->descriptor.bNumConfigurations &&
+ i < USB_MAXCONFIG; i++)
kfree(dev->rawdescriptors[i]);
kfree(dev->rawdescriptors);
dev->rawdescriptors = NULL;
}
- for (c = 0; c < dev->descriptor.bNumConfigurations; c++) {
+ for (c = 0; c < dev->descriptor.bNumConfigurations &&
+ c < USB_MAXCONFIG; c++) {
struct usb_host_config *cf = &dev->config[c];
kfree(cf->string);
- for (i = 0; i < cf->desc.bNumInterfaces; i++) {
+ for (i = 0; i < cf->desc.bNumInterfaces &&
+ i < USB_MAXINTERFACES; i++) {
if (cf->intf_cache[i])
kref_put(&cf->intf_cache[i]->ref,
usb_release_interface_cache);