diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2017-01-20 13:48:29 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-01-20 13:48:29 -0800 |
commit | 7c02ef2b00a2c6f8b8cc332427c4d07269b647a4 (patch) | |
tree | 9182ce4b36e7c54242c8811c49dae26de159a85b | |
parent | ae4c40372bb6e54db2ba037da9ba977630f6cee7 (diff) | |
parent | 2e83ddb8b78f828073377aef6e90a7952e8b0fa3 (diff) |
Merge "USB: gadget: mass_storage: Fix Null pointer access during disconnect"
-rw-r--r-- | drivers/usb/gadget/function/f_mass_storage.c | 12 |
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; |