diff options
Diffstat (limited to 'drivers/usb/core/config.c')
| -rw-r--r-- | drivers/usb/core/config.c | 12 | 
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c index 9d6cb709ca7b..151a74a54386 100644 --- a/drivers/usb/core/config.c +++ b/drivers/usb/core/config.c @@ -921,7 +921,7 @@ int usb_get_bos_descriptor(struct usb_device *dev)  	struct usb_bos_descriptor *bos;  	struct usb_dev_cap_header *cap;  	struct usb_ssp_cap_descriptor *ssp_cap; -	unsigned char *buffer; +	unsigned char *buffer, *buffer0;  	int length, total_len, num, i, ssac;  	__u8 cap_type;  	int ret; @@ -966,10 +966,12 @@ int usb_get_bos_descriptor(struct usb_device *dev)  			ret = -ENOMSG;  		goto err;  	} + +	buffer0 = buffer;  	total_len -= length; +	buffer += length;  	for (i = 0; i < num; i++) { -		buffer += length;  		cap = (struct usb_dev_cap_header *)buffer;  		if (total_len < sizeof(*cap) || total_len < cap->bLength) { @@ -983,8 +985,6 @@ int usb_get_bos_descriptor(struct usb_device *dev)  			break;  		} -		total_len -= length; -  		if (cap->bDescriptorType != USB_DT_DEVICE_CAPABILITY) {  			dev_warn(ddev, "descriptor type invalid, skip\n");  			continue; @@ -1019,7 +1019,11 @@ int usb_get_bos_descriptor(struct usb_device *dev)  		default:  			break;  		} + +		total_len -= length; +		buffer += length;  	} +	dev->bos->desc->wTotalLength = cpu_to_le16(buffer - buffer0);  	return 0;  |