| From: Johan Hovold <johan@kernel.org> |
| Date: Tue, 3 Jan 2017 16:40:02 +0100 |
| Subject: USB: serial: spcp8x5: fix NULL-deref at open |
| |
| commit cc0909248258f679c4bb4cd315565d40abaf6bc6 upstream. |
| |
| Fix NULL-pointer dereference in open() should the device lack the |
| expected endpoints: |
| |
| Unable to handle kernel NULL pointer dereference at virtual address 00000030 |
| ... |
| PC is at spcp8x5_open+0x30/0xd0 [spcp8x5] |
| |
| Fixes: 619a6f1d1423 ("USB: add usb-serial spcp8x5 driver") |
| Signed-off-by: Johan Hovold <johan@kernel.org> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/usb/serial/spcp8x5.c | 14 ++++++++++++++ |
| 1 file changed, 14 insertions(+) |
| |
| --- a/drivers/usb/serial/spcp8x5.c |
| +++ b/drivers/usb/serial/spcp8x5.c |
| @@ -154,6 +154,19 @@ static int spcp8x5_probe(struct usb_seri |
| return 0; |
| } |
| |
| +static int spcp8x5_attach(struct usb_serial *serial) |
| +{ |
| + unsigned char num_ports = serial->num_ports; |
| + |
| + if (serial->num_bulk_in < num_ports || |
| + serial->num_bulk_out < num_ports) { |
| + dev_err(&serial->interface->dev, "missing endpoints\n"); |
| + return -ENODEV; |
| + } |
| + |
| + return 0; |
| +} |
| + |
| static int spcp8x5_port_probe(struct usb_serial_port *port) |
| { |
| const struct usb_device_id *id = usb_get_serial_data(port->serial); |
| @@ -477,6 +490,7 @@ static struct usb_serial_driver spcp8x5_ |
| .tiocmget = spcp8x5_tiocmget, |
| .tiocmset = spcp8x5_tiocmset, |
| .probe = spcp8x5_probe, |
| + .attach = spcp8x5_attach, |
| .port_probe = spcp8x5_port_probe, |
| .port_remove = spcp8x5_port_remove, |
| }; |