Home Home > GIT Browse > openSUSE-15.0
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2019-07-16 16:23:44 +0200
committerTakashi Iwai <tiwai@suse.de>2019-07-16 16:23:56 +0200
commit46fabe2b102adc6691a56b0be491a27a57acf992 (patch)
tree09308ca7d93d9aaad8cbb3e171e1a112e838aac0
parent3902c9396b364fcdba2040f1c28d705e8be9ef2d (diff)
usb: gadget: ether: Fix race between gether_disconnect and
rx_submit (bsc#1051510). suse-commit: f9796f8e4bc3fcfd3c95b6aa341f0a29e0479cba
-rw-r--r--drivers/usb/gadget/function/u_ether.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c
index bbfe79e2b9a9..563e15e13c70 100644
--- a/drivers/usb/gadget/function/u_ether.c
+++ b/drivers/usb/gadget/function/u_ether.c
@@ -190,11 +190,12 @@ rx_submit(struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags)
out = dev->port_usb->out_ep;
else
out = NULL;
- spin_unlock_irqrestore(&dev->lock, flags);
if (!out)
+ {
+ spin_unlock_irqrestore(&dev->lock, flags);
return -ENOTCONN;
-
+ }
/* Padding up to RX_EXTRA handles minor disagreements with host.
* Normally we use the USB "terminate on short read" convention;
@@ -218,6 +219,7 @@ rx_submit(struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags)
if (dev->port_usb->is_fixed)
size = max_t(size_t, size, dev->port_usb->fixed_out_len);
+ spin_unlock_irqrestore(&dev->lock, flags);
skb = __netdev_alloc_skb(dev->net, size + NET_IP_ALIGN, gfp_flags);
if (skb == NULL) {