lkml.org 
[lkml]   [2017]   [Jun]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.10 051/268] USB: cdc-acm: fix double usb_autopm_put_interface() in acm_port_activate()
    Date
    From: Alexey Khoroshilov <khoroshilov@ispras.ru>

    commit 070c0b17f6a1ba39dff9be112218127e7e8fd456 upstream.

    If acm_submit_read_urbs() fails in acm_port_activate(), error handling
    code calls usb_autopm_put_interface() while it is already called
    before acm_submit_read_urbs(). The patch reorganizes error handling code
    to avoid double decrement of USB interface's PM-usage counter.

    Found by Linux Driver Verification project (linuxtesting.org).

    Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru>
    Acked-by: Oliver Neukum <oliver@neukum.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Willy Tarreau <w@1wt.eu>
    ---
    drivers/usb/class/cdc-acm.c | 6 ++++--
    1 file changed, 4 insertions(+), 2 deletions(-)

    diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
    index b364845..e16b9ef 100644
    --- a/drivers/usb/class/cdc-acm.c
    +++ b/drivers/usb/class/cdc-acm.c
    @@ -546,13 +546,16 @@ static int acm_port_activate(struct tty_port *port, struct tty_struct *tty)
    if (usb_submit_urb(acm->ctrlurb, GFP_KERNEL)) {
    dev_err(&acm->control->dev,
    "%s - usb_submit_urb(ctrl irq) failed\n", __func__);
    + usb_autopm_put_interface(acm->control);
    goto error_submit_urb;
    }

    acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS;
    if (acm_set_control(acm, acm->ctrlout) < 0 &&
    - (acm->ctrl_caps & USB_CDC_CAP_LINE))
    + (acm->ctrl_caps & USB_CDC_CAP_LINE)) {
    + usb_autopm_put_interface(acm->control);
    goto error_set_control;
    + }

    usb_autopm_put_interface(acm->control);

    @@ -579,7 +582,6 @@ error_submit_read_urbs:
    error_set_control:
    usb_kill_urb(acm->ctrlurb);
    error_submit_urb:
    - usb_autopm_put_interface(acm->control);
    error_get_interface:
    disconnected:
    mutex_unlock(&acm->mutex);
    --
    2.8.0.rc2.1.gbe9624a
    \
     
     \ /
      Last update: 2017-06-19 21:31    [W:4.044 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site