isp1760-hcd: fix possible memory leak if urb could not be enqueued
authorMichael Grzeschik <m.grzeschik@pengutronix.de>
Thu, 5 Apr 2012 12:56:10 +0000 (14:56 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 18 Apr 2012 20:51:19 +0000 (13:51 -0700)
After packetize_urb was called, we could still run into an error path
and will not hand over the prepared qtd to the qtd_list. Make sure to
free the prepared qtd in that case to avoid memory leaks.

Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/isp1760-hcd.c

index 4a378d38b954ebc3b220a91330733e18fe6ad087..a35bbddf89685a78c78a8dec2dc9a28d1efd6d76 100644 (file)
@@ -1562,11 +1562,14 @@ static int isp1760_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
 
        if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
                retval = -ESHUTDOWN;
+               qtd_list_free(&new_qtds);
                goto out;
        }
        retval = usb_hcd_link_urb_to_ep(hcd, urb);
-       if (retval)
+       if (retval) {
+               qtd_list_free(&new_qtds);
                goto out;
+       }
 
        qh = urb->ep->hcpriv;
        if (qh) {
@@ -1584,6 +1587,7 @@ static int isp1760_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
                if (!qh) {
                        retval = -ENOMEM;
                        usb_hcd_unlink_urb_from_ep(hcd, urb);
+                       qtd_list_free(&new_qtds);
                        goto out;
                }
                list_add_tail(&qh->qh_list, ep_queue);