USB: serial: spcp8x5: fix modem-status handling
Make sure to detect short control transfers and return zero on success when retrieving the modem status. This fixes the TIOCMGET implementation which sincee1ed212d85
("USB: spcp8x5: add proper modem-status support") has returned TIOCM_LE on successful retrieval, and avoids leaking bits from the stack on short transfers. This also fixes the carrier-detect implementation which since the above mentioned commit unconditionally has returned true. Fixes:e1ed212d85
("USB: spcp8x5: add proper modem-status support") Cc: stable <stable@vger.kernel.org> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Johan Hovold <johan@kernel.org>
This commit is contained in:
parent
8c34cb8ddf
commit
5ed8d41023
|
@ -232,11 +232,17 @@ static int spcp8x5_get_msr(struct usb_serial_port *port, u8 *status)
|
|||
ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
|
||||
GET_UART_STATUS, GET_UART_STATUS_TYPE,
|
||||
0, GET_UART_STATUS_MSR, buf, 1, 100);
|
||||
if (ret < 0)
|
||||
if (ret < 1) {
|
||||
dev_err(&port->dev, "failed to get modem status: %d\n", ret);
|
||||
if (ret >= 0)
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
dev_dbg(&port->dev, "0xc0:0x22:0:6 %d - 0x02%x\n", ret, *buf);
|
||||
*status = *buf;
|
||||
ret = 0;
|
||||
out:
|
||||
kfree(buf);
|
||||
|
||||
return ret;
|
||||
|
|
Loading…
Reference in a new issue