diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c index 48bc8a4814ac..0d533b225632 100644 --- a/drivers/usb/core/config.c +++ b/drivers/usb/core/config.c @@ -824,6 +824,14 @@ static int usb_parse_configuration(struct usb_device *dev, int cfgidx, */ void usb_destroy_configuration(struct usb_device *dev) { + usb_destroy_descriptor(dev); + kfree(dev->config); + dev->config = NULL; +} + +void usb_destroy_descriptor(struct usb_device *dev) +{ + int c, i; if (!dev->config) @@ -847,10 +855,8 @@ void usb_destroy_configuration(struct usb_device *dev) usb_release_interface_cache); } } - kfree(dev->config); - dev->config = NULL; -} +} /* * Get the USB config descriptors, cache and parse'em diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 4d59d927ae3e..7982309cb825 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c @@ -1069,8 +1069,10 @@ int usb_get_device_descriptor(struct usb_device *dev, unsigned int size) return -ENOMEM; ret = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, size); - if (ret >= 0) + if (ret >= 0) { + usb_destroy_descriptor(dev); memcpy(&dev->descriptor, desc, size); + } kfree(desc); return ret; } diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index 67f8713d3fa3..da2836370fb2 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h @@ -529,6 +529,7 @@ extern void usb_disconnect(struct usb_device **); extern int usb_get_configuration(struct usb_device *dev); extern void usb_destroy_configuration(struct usb_device *dev); +extern void usb_destroy_descriptor(struct usb_device *dev); /*-------------------------------------------------------------------------*/