USB: cdc-acm: fix potential urb leak and PM imbalance in write
authorJohan Hovold <jhovold@gmail.com>
Mon, 26 May 2014 17:23:41 +0000 (19:23 +0200)
committerBen Hutchings <ben@decadent.org.uk>
Fri, 11 Jul 2014 12:33:41 +0000 (13:33 +0100)
commit 183a45087d126d126e8dd1d9b2602fc129dff9ad upstream.

Make sure to check return value of autopm get in write() in order to
avoid urb leak and PM counter imbalance on errors.

Fixes: 11ea859d64b6 ("USB: additional power savings for cdc-acm devices
that support remote wakeup")

Signed-off-by: Johan Hovold <jhovold@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
[bwh: Backported to 3.2:
 - Adjust context
 - Error/status variable is called rc, not stat]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/usb/class/cdc-acm.c

index ed988ef..29e76be 100644 (file)
@@ -191,7 +191,13 @@ static int acm_write_start(struct acm *acm, int wbn)
 
        dev_vdbg(&acm->data->dev, "%s - susp_count %d\n", __func__,
                                                        acm->susp_count);
-       usb_autopm_get_interface_async(acm->control);
+       rc = usb_autopm_get_interface_async(acm->control);
+       if (rc) {
+               wb->use = 0;
+               spin_unlock_irqrestore(&acm->write_lock, flags);
+               return rc;
+       }
+
        if (acm->susp_count) {
                usb_anchor_urb(wb->urb, &acm->delayed);
                spin_unlock_irqrestore(&acm->write_lock, flags);