diff options
Diffstat (limited to 'drivers/usb/core/usb.c')
| -rw-r--r-- | drivers/usb/core/usb.c | 6 | 
1 files changed, 3 insertions, 3 deletions
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);   */  int __usb_get_extra_descriptor(char *buffer, unsigned size, -			       unsigned char type, void **ptr) +			       unsigned char type, void **ptr, size_t minsize)  {  	struct usb_descriptor_header *header;  	while (size >= sizeof(struct usb_descriptor_header)) {  		header = (struct usb_descriptor_header *)buffer; -		if (header->bLength < 2) { +		if (header->bLength < 2 || header->bLength > size) {  			printk(KERN_ERR  				"%s: bogus descriptor, type %d length %d\n",  				usbcore_name, @@ -848,7 +848,7 @@ int __usb_get_extra_descriptor(char *buffer, unsigned size,  			return -1;  		} -		if (header->bDescriptorType == type) { +		if (header->bDescriptorType == type && header->bLength >= minsize) {  			*ptr = header;  			return 0;  		}  |