Skip to content

Commit

Permalink
usb: gadget: s3c-hsudc: remove usage of list iterator past the loop body
Browse files Browse the repository at this point in the history
If the list representing the request queue does not contain the expected
request, the value of the list_for_each_entry() iterator will not point
to a valid structure. To avoid type confusion in such case, the list
iterator scope will be limited to the list_for_each_entry() loop.

In preparation to limiting scope of the list iterator to the list traversal
loop, use a dedicated pointer to point to the found request object [1].

Link: https://lore.kernel.org/all/YhdfEIwI4EdtHdym@kroah.com/
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Signed-off-by: Jakob Koschel <jakobkoschel@gmail.com>
Link: https://lore.kernel.org/r/20220308171818.384491-15-jakobkoschel@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Jakob-Koschel authored and gregkh committed Mar 15, 2022
1 parent d5d0b28 commit b6c44be
Showing 1 changed file with 7 additions and 5 deletions.
12 changes: 7 additions & 5 deletions drivers/usb/gadget/udc/s3c-hsudc.c
Expand Up @@ -877,7 +877,7 @@ static int s3c_hsudc_dequeue(struct usb_ep *_ep, struct usb_request *_req)
{
struct s3c_hsudc_ep *hsep = our_ep(_ep);
struct s3c_hsudc *hsudc = hsep->dev;
struct s3c_hsudc_req *hsreq;
struct s3c_hsudc_req *hsreq = NULL, *iter;
unsigned long flags;

hsep = our_ep(_ep);
Expand All @@ -886,11 +886,13 @@ static int s3c_hsudc_dequeue(struct usb_ep *_ep, struct usb_request *_req)

spin_lock_irqsave(&hsudc->lock, flags);

list_for_each_entry(hsreq, &hsep->queue, queue) {
if (&hsreq->req == _req)
break;
list_for_each_entry(iter, &hsep->queue, queue) {
if (&iter->req != _req)
continue;
hsreq = iter;
break;
}
if (&hsreq->req != _req) {
if (!hsreq) {
spin_unlock_irqrestore(&hsudc->lock, flags);
return -EINVAL;
}
Expand Down

0 comments on commit b6c44be

Please sign in to comment.