Skip to content

Commit abbccd8

Browse files
jhovoldgregkh
authored andcommitted
USB: serial: mos7840: fix control-message error handling
[ 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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 0d1b459 commit abbccd8

1 file changed

Lines changed: 15 additions & 4 deletions

File tree

drivers/usb/serial/mos7840.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -285,9 +285,15 @@ static int mos7840_get_reg_sync(struct usb_serial_port *port, __u16 reg,
285285
ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), MCS_RDREQ,
286286
MCS_RD_RTYPE, 0, reg, buf, VENDOR_READ_LENGTH,
287287
MOS_WDR_TIMEOUT);
288+
if (ret < VENDOR_READ_LENGTH) {
289+
if (ret >= 0)
290+
ret = -EIO;
291+
goto out;
292+
}
293+
288294
*val = buf[0];
289295
dev_dbg(&port->dev, "%s offset is %x, return val %x\n", __func__, reg, *val);
290-
296+
out:
291297
kfree(buf);
292298
return ret;
293299
}
@@ -353,8 +359,13 @@ static int mos7840_get_uart_reg(struct usb_serial_port *port, __u16 reg,
353359
ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), MCS_RDREQ,
354360
MCS_RD_RTYPE, Wval, reg, buf, VENDOR_READ_LENGTH,
355361
MOS_WDR_TIMEOUT);
362+
if (ret < VENDOR_READ_LENGTH) {
363+
if (ret >= 0)
364+
ret = -EIO;
365+
goto out;
366+
}
356367
*val = buf[0];
357-
368+
out:
358369
kfree(buf);
359370
return ret;
360371
}
@@ -1490,10 +1501,10 @@ static int mos7840_tiocmget(struct tty_struct *tty)
14901501
return -ENODEV;
14911502

14921503
status = mos7840_get_uart_reg(port, MODEM_STATUS_REGISTER, &msr);
1493-
if (status != 1)
1504+
if (status < 0)
14941505
return -EIO;
14951506
status = mos7840_get_uart_reg(port, MODEM_CONTROL_REGISTER, &mcr);
1496-
if (status != 1)
1507+
if (status < 0)
14971508
return -EIO;
14981509
result = ((mcr & MCR_DTR) ? TIOCM_DTR : 0)
14991510
| ((mcr & MCR_RTS) ? TIOCM_RTS : 0)

0 commit comments

Comments
 (0)