| From c09cbec34c0da73b12e20d0c4ebf5b07bf9424b1 Mon Sep 17 00:00:00 2001 |
| From: Johan Hovold <johan@kernel.org> |
| Date: Tue, 3 Jan 2017 16:39:48 +0100 |
| Subject: [PATCH] USB: serial: keyspan_pda: verify endpoints at probe |
| |
| commit 5d9b0f859babe96175cd33d7162a9463a875ffde upstream. |
| |
| Check for the expected endpoints in attach() and fail loudly if not |
| present. |
| |
| Note that failing to do this appears to be benign since da280e348866 |
| ("USB: keyspan_pda: clean up write-urb busy handling") which prevents a |
| NULL-pointer dereference in write() by never marking a non-existent |
| write-urb as free. |
| |
| Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") |
| Cc: stable <stable@vger.kernel.org> # < v3.3 |
| Signed-off-by: Johan Hovold <johan@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c |
| index 4f7e072e4e00..930be98d59b3 100644 |
| --- a/drivers/usb/serial/keyspan_pda.c |
| +++ b/drivers/usb/serial/keyspan_pda.c |
| @@ -699,6 +699,19 @@ MODULE_FIRMWARE("keyspan_pda/keyspan_pda.fw"); |
| MODULE_FIRMWARE("keyspan_pda/xircom_pgs.fw"); |
| #endif |
| |
| +static int keyspan_pda_attach(struct usb_serial *serial) |
| +{ |
| + unsigned char num_ports = serial->num_ports; |
| + |
| + if (serial->num_bulk_out < num_ports || |
| + serial->num_interrupt_in < num_ports) { |
| + dev_err(&serial->interface->dev, "missing endpoints\n"); |
| + return -ENODEV; |
| + } |
| + |
| + return 0; |
| +} |
| + |
| static int keyspan_pda_port_probe(struct usb_serial_port *port) |
| { |
| |
| @@ -776,6 +789,7 @@ static struct usb_serial_driver keyspan_pda_device = { |
| .break_ctl = keyspan_pda_break_ctl, |
| .tiocmget = keyspan_pda_tiocmget, |
| .tiocmset = keyspan_pda_tiocmset, |
| + .attach = keyspan_pda_attach, |
| .port_probe = keyspan_pda_port_probe, |
| .port_remove = keyspan_pda_port_remove, |
| }; |
| -- |
| 2.10.1 |
| |