mirror of
https://github.com/Divested-Mobile/DivestOS-Build.git
synced 2024-12-22 06:04:57 -05:00
55 lines
1.7 KiB
Diff
55 lines
1.7 KiB
Diff
|
From 5a07975ad0a36708c6b0a5b9fea1ff811d0b0c1f Mon Sep 17 00:00:00 2001
|
||
|
From: Oliver Neukum <oneukum@suse.com>
|
||
|
Date: Thu, 31 Mar 2016 12:04:26 -0400
|
||
|
Subject: USB: digi_acceleport: do sanity checking for the number of ports
|
||
|
|
||
|
The driver can be crashed with devices that expose crafted descriptors
|
||
|
with too few endpoints.
|
||
|
|
||
|
See: http://seclists.org/bugtraq/2016/Mar/61
|
||
|
|
||
|
Signed-off-by: Oliver Neukum <ONeukum@suse.com>
|
||
|
[johan: fix OOB endpoint check and add error messages ]
|
||
|
Cc: stable <stable@vger.kernel.org>
|
||
|
Signed-off-by: Johan Hovold <johan@kernel.org>
|
||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||
|
---
|
||
|
drivers/usb/serial/digi_acceleport.c | 19 +++++++++++++++++++
|
||
|
1 file changed, 19 insertions(+)
|
||
|
|
||
|
diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c
|
||
|
index 010a42a..16e8e37 100644
|
||
|
--- a/drivers/usb/serial/digi_acceleport.c
|
||
|
+++ b/drivers/usb/serial/digi_acceleport.c
|
||
|
@@ -1251,8 +1251,27 @@ static int digi_port_init(struct usb_serial_port *port, unsigned port_num)
|
||
|
|
||
|
static int digi_startup(struct usb_serial *serial)
|
||
|
{
|
||
|
+ struct device *dev = &serial->interface->dev;
|
||
|
struct digi_serial *serial_priv;
|
||
|
int ret;
|
||
|
+ int i;
|
||
|
+
|
||
|
+ /* check whether the device has the expected number of endpoints */
|
||
|
+ if (serial->num_port_pointers < serial->type->num_ports + 1) {
|
||
|
+ dev_err(dev, "OOB endpoints missing\n");
|
||
|
+ return -ENODEV;
|
||
|
+ }
|
||
|
+
|
||
|
+ for (i = 0; i < serial->type->num_ports + 1 ; i++) {
|
||
|
+ if (!serial->port[i]->read_urb) {
|
||
|
+ dev_err(dev, "bulk-in endpoint missing\n");
|
||
|
+ return -ENODEV;
|
||
|
+ }
|
||
|
+ if (!serial->port[i]->write_urb) {
|
||
|
+ dev_err(dev, "bulk-out endpoint missing\n");
|
||
|
+ return -ENODEV;
|
||
|
+ }
|
||
|
+ }
|
||
|
|
||
|
serial_priv = kzalloc(sizeof(*serial_priv), GFP_KERNEL);
|
||
|
if (!serial_priv)
|
||
|
--
|
||
|
cgit v1.1
|
||
|
|