| From foo@baz Wed Aug 22 09:42:09 CEST 2018 |
| From: Chunfeng Yun <chunfeng.yun@mediatek.com> |
| Date: Fri, 25 May 2018 17:24:57 +0800 |
| Subject: usb: gadget: composite: fix delayed_status race condition when set_interface |
| |
| From: Chunfeng Yun <chunfeng.yun@mediatek.com> |
| |
| [ Upstream commit 980900d6318066b9f8314bfb87329a20fd0d1ca4 ] |
| |
| It happens when enable debug log, if set_alt() returns |
| USB_GADGET_DELAYED_STATUS and usb_composite_setup_continue() |
| is called before increasing count of @delayed_status, |
| so fix it by using spinlock of @cdev->lock. |
| |
| Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com> |
| Tested-by: Jay Hsu <shih-chieh.hsu@mediatek.com> |
| Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/usb/gadget/composite.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| --- a/drivers/usb/gadget/composite.c |
| +++ b/drivers/usb/gadget/composite.c |
| @@ -1712,6 +1712,8 @@ composite_setup(struct usb_gadget *gadge |
| */ |
| if (w_value && !f->get_alt) |
| break; |
| + |
| + spin_lock(&cdev->lock); |
| value = f->set_alt(f, w_index, w_value); |
| if (value == USB_GADGET_DELAYED_STATUS) { |
| DBG(cdev, |
| @@ -1721,6 +1723,7 @@ composite_setup(struct usb_gadget *gadge |
| DBG(cdev, "delayed_status count %d\n", |
| cdev->delayed_status); |
| } |
| + spin_unlock(&cdev->lock); |
| break; |
| case USB_REQ_GET_INTERFACE: |
| if (ctrl->bRequestType != (USB_DIR_IN|USB_RECIP_INTERFACE)) |