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 udc process the request queued on step 2, will cause kernel > NULL pointer dereference exception. > > Signed-off-by: Du, Changbin <changbin.du@xxxxxxxxx> > --- > This patch is seprated from below patches because gadget layer has > added the 'enabled' flag in v4.4. so abandon it and submit new one. > [PATCH 0/2] Two fix for dwc2 gadget driver > usb: dwc2: add ep enabled flag to avoid double enable/disable > usb: dwc2: forbid queuing request to a disabled ep > > --- > include/linux/usb/gadget.h | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h > index 3d583a1..d813bd2 100644 > --- a/include/linux/usb/gadget.h > +++ b/include/linux/usb/gadget.h > @@ -402,6 +402,9 @@ static inline void usb_ep_free_request(struct usb_ep *ep, > static inline int usb_ep_queue(struct usb_ep *ep, > struct usb_request *req, gfp_t gfp_flags) > { > + if (!ep->enabled) > + return -ESHUTDOWN; same warn here: if (WARN_ON_ONCE(!ep->enabled)) return -ESHUTDOWN; > + > return ep->ops->queue(ep, req, gfp_flags); > } > > -- > 2.5.0 > -- balbi
Attachment:
signature.asc
Description: PGP signature