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); | |||
832 | */ | 832 | */ |
833 | 833 | ||
834 | int __usb_get_extra_descriptor(char *buffer, unsigned size, | 834 | int __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 | } |