Hi, changbin.du@xxxxxxxxx writes: > From: "Du, Changbin" <changbin.du@xxxxxxxxx> > > Queue a request to disabled ep doesn't make sense, and induce caller > make mistakes. > > Here is a example for the android mtp gadget function driver. A mem > corruption can happen on below senario. > 1) On disconnect, mtp driver disable its EPs, > 2) During send_file_work and receive_file_work, mtp queues a request > to ep. (The mtp driver need improve its synchronization logic!) > 3) mtp_function_unbind is invoked and all mtp requests are freed. > 4) when dwc2 process the request queued on step 2, will cause kernel > NULL pointer dereference exception. > > Signed-off-by: Du, Changbin <changbin.du@xxxxxxxxx> > --- > drivers/usb/dwc2/gadget.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c > index 586bbcd..4d637ab 100644 > --- a/drivers/usb/dwc2/gadget.c > +++ b/drivers/usb/dwc2/gadget.c > @@ -786,6 +786,12 @@ static int dwc2_hsotg_ep_queue(struct usb_ep *ep, struct usb_request *req, > ep->name, req, req->length, req->buf, req->no_interrupt, > req->zero, req->short_not_ok); > > + if (!hs_ep->enabled) { > + dev_warn(hs->dev, "%s: cannot queue to disabled ep\n", > + __func__); similar comment to previous patch: if (dev_WARN_ONCE(hs->dev, !hs_ep->enabled, "cannot queue to disabled ep %s\n", hs_ep->name)) > + return -ESHUTDOWN; > + } > + > /* Prevent new request submission when controller is suspended */ > if (hs->lx_state == DWC2_L2) { > dev_dbg(hs->dev, "%s: don't submit request while suspended\n", > -- > 2.5.0 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ -- balbi
Attachment:
signature.asc
Description: PGP signature