Commit 1568c58d authored by Johan Hovold's avatar Johan Hovold

USB: serial: io_edgeport: add missing active-port sanity check

The driver receives the active port number from the device, but never
made sure that the port number was valid. This could lead to a
NULL-pointer dereference or memory corruption in case a device sends
data for an invalid port.

Fixes: 1da177e4 ("Linux-2.6.12-rc2")
Cc: stable <stable@vger.kernel.org>
Reviewed-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
parent e37d1aed
...@@ -1725,7 +1725,8 @@ static void edge_break(struct tty_struct *tty, int break_state) ...@@ -1725,7 +1725,8 @@ static void edge_break(struct tty_struct *tty, int break_state)
static void process_rcvd_data(struct edgeport_serial *edge_serial, static void process_rcvd_data(struct edgeport_serial *edge_serial,
unsigned char *buffer, __u16 bufferLength) unsigned char *buffer, __u16 bufferLength)
{ {
struct device *dev = &edge_serial->serial->dev->dev; struct usb_serial *serial = edge_serial->serial;
struct device *dev = &serial->dev->dev;
struct usb_serial_port *port; struct usb_serial_port *port;
struct edgeport_port *edge_port; struct edgeport_port *edge_port;
__u16 lastBufferLength; __u16 lastBufferLength;
...@@ -1821,9 +1822,8 @@ static void process_rcvd_data(struct edgeport_serial *edge_serial, ...@@ -1821,9 +1822,8 @@ static void process_rcvd_data(struct edgeport_serial *edge_serial,
/* spit this data back into the tty driver if this /* spit this data back into the tty driver if this
port is open */ port is open */
if (rxLen) { if (rxLen && edge_serial->rxPort < serial->num_ports) {
port = edge_serial->serial->port[ port = serial->port[edge_serial->rxPort];
edge_serial->rxPort];
edge_port = usb_get_serial_port_data(port); edge_port = usb_get_serial_port_data(port);
if (edge_port && edge_port->open) { if (edge_port && edge_port->open) {
dev_dbg(dev, "%s - Sending %d bytes to TTY for port %d\n", dev_dbg(dev, "%s - Sending %d bytes to TTY for port %d\n",
...@@ -1833,8 +1833,8 @@ static void process_rcvd_data(struct edgeport_serial *edge_serial, ...@@ -1833,8 +1833,8 @@ static void process_rcvd_data(struct edgeport_serial *edge_serial,
rxLen); rxLen);
edge_port->port->icount.rx += rxLen; edge_port->port->icount.rx += rxLen;
} }
buffer += rxLen;
} }
buffer += rxLen;
break; break;
case EXPECT_HDR3: /* Expect 3rd byte of status header */ case EXPECT_HDR3: /* Expect 3rd byte of status header */
...@@ -1869,6 +1869,8 @@ static void process_rcvd_status(struct edgeport_serial *edge_serial, ...@@ -1869,6 +1869,8 @@ static void process_rcvd_status(struct edgeport_serial *edge_serial,
__u8 code = edge_serial->rxStatusCode; __u8 code = edge_serial->rxStatusCode;
/* switch the port pointer to the one being currently talked about */ /* switch the port pointer to the one being currently talked about */
if (edge_serial->rxPort >= edge_serial->serial->num_ports)
return;
port = edge_serial->serial->port[edge_serial->rxPort]; port = edge_serial->serial->port[edge_serial->rxPort];
edge_port = usb_get_serial_port_data(port); edge_port = usb_get_serial_port_data(port);
if (edge_port == NULL) { if (edge_port == NULL) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment