summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-01-20 13:48:29 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2017-01-20 13:48:29 -0800
commit7c02ef2b00a2c6f8b8cc332427c4d07269b647a4 (patch)
tree9182ce4b36e7c54242c8811c49dae26de159a85b
parentae4c40372bb6e54db2ba037da9ba977630f6cee7 (diff)
parent2e83ddb8b78f828073377aef6e90a7952e8b0fa3 (diff)
Merge "USB: gadget: mass_storage: Fix Null pointer access during disconnect"
-rw-r--r--drivers/usb/gadget/function/f_mass_storage.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/usb/gadget/function/f_mass_storage.c b/drivers/usb/gadget/function/f_mass_storage.c
index 0a5003ffb621..7cafd0dd59f5 100644
--- a/drivers/usb/gadget/function/f_mass_storage.c
+++ b/drivers/usb/gadget/function/f_mass_storage.c
@@ -454,13 +454,23 @@ static void bulk_in_complete(struct usb_ep *ep, struct usb_request *req)
struct fsg_buffhd *bh = req->context;
if (req->status || req->actual != req->length)
- DBG(common, "%s --> %d, %u/%u\n", __func__,
+ pr_debug("%s --> %d, %u/%u\n", __func__,
req->status, req->actual, req->length);
if (req->status == -ECONNRESET) /* Request was cancelled */
usb_ep_fifo_flush(ep);
/* Hold the lock while we update the request and buffer states */
smp_wmb();
+ /*
+ * Disconnect and completion might race each other and driver data
+ * is set to NULL during ep disable. So, add a check if that is case.
+ */
+ if (!common) {
+ bh->inreq_busy = 0;
+ bh->state = BUF_STATE_EMPTY;
+ return;
+ }
+
spin_lock(&common->lock);
bh->inreq_busy = 0;
bh->state = BUF_STATE_EMPTY;