Patch "usb: gadget: f_hid: fix: Free out requests" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
usb: gadget: f_hid: fix: Free out requests
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
usb-gadget-f_hid-fix-free-out-requests.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
20d2ca955bd09639c7b01db5761d157c297aea0aMon Sep 17 00:00:00 2001
From: Krzysztof Opasiak <[email protected]>
Date: Thu, 19 Jan 2017 18:55:27 +0100
Subject: usb: gadget: f_hid: fix: Free out requests
From: Krzysztof Opasiak <[email protected]>
commit 20d2ca955bd09639c7b01db5761d157c297aea0a upstream.
Requests for out endpoint are allocated in bind() function but never released.
This commit ensures that all pending requests are released when we disable out endpoint.
--- drivers/usb/gadget/function/f_hid.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-)
drivers/usb/gadget/function/f_hid.c +24 -8
@@ -371,20 +371,36 @@ static inline struct usb_request *hidg_astatic void hidg_set_report_complete (struct usb_ep *ep,struct usb_request *req) {struct f_hidg *hidg = (struct f_hidg *) req->context; +struct usb_composite_dev *cdev = hidg->func.config->cdev;struct f_hidg_req_list *req_list;unsigned long flags; - req_list =kzalloc (sizeof (*req_list),GFP_ATOMIC ); -if (!req_list) -return ; +switch (req->status) { +case 0 : + req_list =kzalloc (sizeof (*req_list),GFP_ATOMIC ); +if (!req_list) { +ERROR (cdev,"Unable to allocate mem for req_list\n" ); + goto free_req; + } - req_list->req = req; + req_list->req = req; -spin_lock_irqsave (&hidg->spinlock, flags); -list_add_tail (&req_list->list, &hidg->completed_out_req); -spin_unlock_irqrestore (&hidg->spinlock, flags); +spin_lock_irqsave (&hidg->spinlock, flags); +list_add_tail (&req_list->list, &hidg->completed_out_req); +spin_unlock_irqrestore (&hidg->spinlock, flags); -wake_up (&hidg->read_queue); +wake_up (&hidg->read_queue); +break ; +default : +ERROR (cdev,"Set report failed %d\n" , req->status); +/* FALLTHROUGH */ +case -ECONNABORTED :/* hardware forced ep reset */ +case -ECONNRESET :/* request dequeued */ +case -ESHUTDOWN :/* disconnect from host */ +free_req: +free_ep_req (ep, req); +return ; + } } static int hidg_setup(struct usb_function *f,
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/usb-gadget-f_hid-use-spinlock-instead-of-mutex.patch queue-4.9/usb-gadget-f_hid-fix-free-out-requests.patch queue-4.9/usb-gadget-f_hid-fix-prevent-accessing-released-memory.patch