lkml.org 
[lkml]   [2017]   [Sep]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH for 4.9 42/59] USB: serial: mos7840: fix control-message error handling
    Date
    From: Johan Hovold <johan@kernel.org>

    [ Upstream commit cd8db057e93ddaacbec025b567490555d2bca280 ]

    Make sure to detect short transfers when reading a device register.

    The modem-status handling had sufficient error checks in place, but move
    handling of short transfers into the register accessor function itself
    for consistency.

    Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
    ---
    drivers/usb/serial/mos7840.c | 19 +++++++++++++++----
    1 file changed, 15 insertions(+), 4 deletions(-)

    diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c
    index 5c4fc3abf6a7..6baacf64b21e 100644
    --- a/drivers/usb/serial/mos7840.c
    +++ b/drivers/usb/serial/mos7840.c
    @@ -285,9 +285,15 @@ static int mos7840_get_reg_sync(struct usb_serial_port *port, __u16 reg,
    ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), MCS_RDREQ,
    MCS_RD_RTYPE, 0, reg, buf, VENDOR_READ_LENGTH,
    MOS_WDR_TIMEOUT);
    + if (ret < VENDOR_READ_LENGTH) {
    + if (ret >= 0)
    + ret = -EIO;
    + goto out;
    + }
    +
    *val = buf[0];
    dev_dbg(&port->dev, "%s offset is %x, return val %x\n", __func__, reg, *val);
    -
    +out:
    kfree(buf);
    return ret;
    }
    @@ -353,8 +359,13 @@ static int mos7840_get_uart_reg(struct usb_serial_port *port, __u16 reg,
    ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), MCS_RDREQ,
    MCS_RD_RTYPE, Wval, reg, buf, VENDOR_READ_LENGTH,
    MOS_WDR_TIMEOUT);
    + if (ret < VENDOR_READ_LENGTH) {
    + if (ret >= 0)
    + ret = -EIO;
    + goto out;
    + }
    *val = buf[0];
    -
    +out:
    kfree(buf);
    return ret;
    }
    @@ -1490,10 +1501,10 @@ static int mos7840_tiocmget(struct tty_struct *tty)
    return -ENODEV;

    status = mos7840_get_uart_reg(port, MODEM_STATUS_REGISTER, &msr);
    - if (status != 1)
    + if (status < 0)
    return -EIO;
    status = mos7840_get_uart_reg(port, MODEM_CONTROL_REGISTER, &mcr);
    - if (status != 1)
    + if (status < 0)
    return -EIO;
    result = ((mcr & MCR_DTR) ? TIOCM_DTR : 0)
    | ((mcr & MCR_RTS) ? TIOCM_RTS : 0)
    --
    2.11.0
    \
     
     \ /
      Last update: 2017-09-14 19:29    [W:4.049 / U:0.620 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site