diff options
Diffstat (limited to 'drivers/usb/gadget/composite.c')
| -rw-r--r-- | drivers/usb/gadget/composite.c | 14 | 
1 files changed, 13 insertions, 1 deletions
| diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 504c1cbc255d..3789c329183c 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -1679,6 +1679,18 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)  	struct usb_function		*f = NULL;  	u8				endp; +	if (w_length > USB_COMP_EP0_BUFSIZ) { +		if (ctrl->bRequestType & USB_DIR_IN) { +			/* Cast away the const, we are going to overwrite on purpose. */ +			__le16 *temp = (__le16 *)&ctrl->wLength; + +			*temp = cpu_to_le16(USB_COMP_EP0_BUFSIZ); +			w_length = USB_COMP_EP0_BUFSIZ; +		} else { +			goto done; +		} +	} +  	/* partial re-init of the response message; the function or the  	 * gadget might need to intercept e.g. a control-OUT completion  	 * when we delegate to it. @@ -2209,7 +2221,7 @@ int composite_dev_prepare(struct usb_composite_driver *composite,  	if (!cdev->req)  		return -ENOMEM; -	cdev->req->buf = kmalloc(USB_COMP_EP0_BUFSIZ, GFP_KERNEL); +	cdev->req->buf = kzalloc(USB_COMP_EP0_BUFSIZ, GFP_KERNEL);  	if (!cdev->req->buf)  		goto fail; |