| From c528fcb116e61afc379a2e0a0f70906b937f1e2c Mon Sep 17 00:00:00 2001 |
| From: Johan Hovold <johan@kernel.org> |
| Date: Tue, 31 Jan 2017 17:17:29 +0100 |
| Subject: [PATCH] USB: serial: keyspan_pda: fix receive sanity checks |
| |
| commit c528fcb116e61afc379a2e0a0f70906b937f1e2c upstream. |
| |
| Make sure to check for short transfers before parsing the receive buffer |
| to avoid acting on stale data. |
| |
| Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") |
| Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Johan Hovold <johan@kernel.org> |
| |
| diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c |
| index 83523fcf6fb9..d2dab2a341b8 100644 |
| --- a/drivers/usb/serial/keyspan_pda.c |
| +++ b/drivers/usb/serial/keyspan_pda.c |
| @@ -139,6 +139,7 @@ static void keyspan_pda_rx_interrupt(struct urb *urb) |
| { |
| struct usb_serial_port *port = urb->context; |
| unsigned char *data = urb->transfer_buffer; |
| + unsigned int len = urb->actual_length; |
| int retval; |
| int status = urb->status; |
| struct keyspan_pda_private *priv; |
| @@ -159,18 +160,26 @@ static void keyspan_pda_rx_interrupt(struct urb *urb) |
| goto exit; |
| } |
| |
| + if (len < 1) { |
| + dev_warn(&port->dev, "short message received\n"); |
| + goto exit; |
| + } |
| + |
| /* see if the message is data or a status interrupt */ |
| switch (data[0]) { |
| case 0: |
| /* rest of message is rx data */ |
| - if (urb->actual_length) { |
| - tty_insert_flip_string(&port->port, data + 1, |
| - urb->actual_length - 1); |
| - tty_flip_buffer_push(&port->port); |
| - } |
| + if (len < 2) |
| + break; |
| + tty_insert_flip_string(&port->port, data + 1, len - 1); |
| + tty_flip_buffer_push(&port->port); |
| break; |
| case 1: |
| /* status interrupt */ |
| + if (len < 3) { |
| + dev_warn(&port->dev, "short interrupt message received\n"); |
| + break; |
| + } |
| dev_dbg(&port->dev, "rx int, d1=%d, d2=%d\n", data[1], data[2]); |
| switch (data[1]) { |
| case 1: /* modemline change */ |
| -- |
| 2.12.0 |
| |