aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/core
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-12-10 04:19:08 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-12-10 04:19:08 -0500
commitb53bde6686fb6952f560e82c5b6c529966d205a4 (patch)
tree7b456d091455d26b2d4be128abba1c115dfece35 /drivers/usb/core
parente67ebf1b3815b2d1fc505dba182761c0be6c179d (diff)
parent40e020c129cfc991e8ab4736d2665351ffd1468d (diff)
Merge 4.20-rc6 into usb-next
We want the USB fixes in here as well. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/core')
-rw-r--r--drivers/usb/core/hub.c5
-rw-r--r--drivers/usb/core/quirks.c4
-rw-r--r--drivers/usb/core/usb.c6
3 files changed, 10 insertions, 5 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 009f92800e03..1d1e61e980f3 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -2261,7 +2261,7 @@ static int usb_enumerate_device_otg(struct usb_device *udev)
2261 /* descriptor may appear anywhere in config */ 2261 /* descriptor may appear anywhere in config */
2262 err = __usb_get_extra_descriptor(udev->rawdescriptors[0], 2262 err = __usb_get_extra_descriptor(udev->rawdescriptors[0],
2263 le16_to_cpu(udev->config[0].desc.wTotalLength), 2263 le16_to_cpu(udev->config[0].desc.wTotalLength),
2264 USB_DT_OTG, (void **) &desc); 2264 USB_DT_OTG, (void **) &desc, sizeof(*desc));
2265 if (err || !(desc->bmAttributes & USB_OTG_HNP)) 2265 if (err || !(desc->bmAttributes & USB_OTG_HNP))
2266 return 0; 2266 return 0;
2267 2267
@@ -5173,7 +5173,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
5173/* Handle notifying userspace about hub over-current events */ 5173/* Handle notifying userspace about hub over-current events */
5174static void port_over_current_notify(struct usb_port *port_dev) 5174static void port_over_current_notify(struct usb_port *port_dev)
5175{ 5175{
5176 static char *envp[] = { NULL, NULL, NULL }; 5176 char *envp[3];
5177 struct device *hub_dev; 5177 struct device *hub_dev;
5178 char *port_dev_path; 5178 char *port_dev_path;
5179 5179
@@ -5197,6 +5197,7 @@ static void port_over_current_notify(struct usb_port *port_dev)
5197 if (!envp[1]) 5197 if (!envp[1])
5198 goto exit; 5198 goto exit;
5199 5199
5200 envp[2] = NULL;
5200 kobject_uevent_env(&hub_dev->kobj, KOBJ_CHANGE, envp); 5201 kobject_uevent_env(&hub_dev->kobj, KOBJ_CHANGE, envp);
5201 5202
5202 kfree(envp[1]); 5203 kfree(envp[1]);
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
index 0690fcff0ea2..514c5214ddb2 100644
--- a/drivers/usb/core/quirks.c
+++ b/drivers/usb/core/quirks.c
@@ -333,6 +333,10 @@ static const struct usb_device_id usb_quirk_list[] = {
333 /* Midiman M-Audio Keystation 88es */ 333 /* Midiman M-Audio Keystation 88es */
334 { USB_DEVICE(0x0763, 0x0192), .driver_info = USB_QUIRK_RESET_RESUME }, 334 { USB_DEVICE(0x0763, 0x0192), .driver_info = USB_QUIRK_RESET_RESUME },
335 335
336 /* SanDisk Ultra Fit and Ultra Flair */
337 { USB_DEVICE(0x0781, 0x5583), .driver_info = USB_QUIRK_NO_LPM },
338 { USB_DEVICE(0x0781, 0x5591), .driver_info = USB_QUIRK_NO_LPM },
339
336 /* M-Systems Flash Disk Pioneers */ 340 /* M-Systems Flash Disk Pioneers */
337 { USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME }, 341 { USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME },
338 342
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index 79d8bd7a612e..4ebfbd737905 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -832,14 +832,14 @@ EXPORT_SYMBOL_GPL(usb_get_current_frame_number);
832 */ 832 */
833 833
834int __usb_get_extra_descriptor(char *buffer, unsigned size, 834int __usb_get_extra_descriptor(char *buffer, unsigned size,
835 unsigned char type, void **ptr) 835 unsigned char type, void **ptr, size_t minsize)
836{ 836{
837 struct usb_descriptor_header *header; 837 struct usb_descriptor_header *header;
838 838
839 while (size >= sizeof(struct usb_descriptor_header)) { 839 while (size >= sizeof(struct usb_descriptor_header)) {
840 header = (struct usb_descriptor_header *)buffer; 840 header = (struct usb_descriptor_header *)buffer;
841 841
842 if (header->bLength < 2) { 842 if (header->bLength < 2 || header->bLength > size) {
843 printk(KERN_ERR 843 printk(KERN_ERR
844 "%s: bogus descriptor, type %d length %d\n", 844 "%s: bogus descriptor, type %d length %d\n",
845 usbcore_name, 845 usbcore_name,
@@ -848,7 +848,7 @@ int __usb_get_extra_descriptor(char *buffer, unsigned size,
848 return -1; 848 return -1;
849 } 849 }
850 850
851 if (header->bDescriptorType == type) { 851 if (header->bDescriptorType == type && header->bLength >= minsize) {
852 *ptr = header; 852 *ptr = header;
853 return 0; 853 return 0;
854 } 854 }