diff options
author | Oliver Neukum <oneukum@suse.com> | 2016-03-31 12:04:25 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-03-31 12:28:46 -0400 |
commit | c55aee1bf0e6b6feec8b2927b43f7a09a6d5f754 (patch) | |
tree | 6fb8e0a9f714302d48aa582ed4308ba328e94440 /drivers | |
parent | 4e9a0b05257f29cf4b75f3209243ed71614d062e (diff) |
USB: cypress_m8: add endpoint sanity check
An attack using missing endpoints exists.
CVE-2016-3137
Signed-off-by: Oliver Neukum <ONeukum@suse.com>
CC: stable@vger.kernel.org
Signed-off-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/serial/cypress_m8.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index b283eb8b86d6..bbeeb2bd55a8 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c | |||
@@ -447,6 +447,11 @@ static int cypress_generic_port_probe(struct usb_serial_port *port) | |||
447 | struct usb_serial *serial = port->serial; | 447 | struct usb_serial *serial = port->serial; |
448 | struct cypress_private *priv; | 448 | struct cypress_private *priv; |
449 | 449 | ||
450 | if (!port->interrupt_out_urb || !port->interrupt_in_urb) { | ||
451 | dev_err(&port->dev, "required endpoint is missing\n"); | ||
452 | return -ENODEV; | ||
453 | } | ||
454 | |||
450 | priv = kzalloc(sizeof(struct cypress_private), GFP_KERNEL); | 455 | priv = kzalloc(sizeof(struct cypress_private), GFP_KERNEL); |
451 | if (!priv) | 456 | if (!priv) |
452 | return -ENOMEM; | 457 | return -ENOMEM; |
@@ -606,12 +611,6 @@ static int cypress_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
606 | cypress_set_termios(tty, port, &priv->tmp_termios); | 611 | cypress_set_termios(tty, port, &priv->tmp_termios); |
607 | 612 | ||
608 | /* setup the port and start reading from the device */ | 613 | /* setup the port and start reading from the device */ |
609 | if (!port->interrupt_in_urb) { | ||
610 | dev_err(&port->dev, "%s - interrupt_in_urb is empty!\n", | ||
611 | __func__); | ||
612 | return -1; | ||
613 | } | ||
614 | |||
615 | usb_fill_int_urb(port->interrupt_in_urb, serial->dev, | 614 | usb_fill_int_urb(port->interrupt_in_urb, serial->dev, |
616 | usb_rcvintpipe(serial->dev, port->interrupt_in_endpointAddress), | 615 | usb_rcvintpipe(serial->dev, port->interrupt_in_endpointAddress), |
617 | port->interrupt_in_urb->transfer_buffer, | 616 | port->interrupt_in_urb->transfer_buffer, |