| From: Johan Hovold <johan@kernel.org> |
| Date: Tue, 3 Jan 2017 16:39:55 +0100 |
| Subject: USB: serial: mos7840: fix NULL-deref at open |
| |
| commit 5c75633ef751dd4cd8f443dc35152c1ae563162e 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 mos7840_open+0x88/0x8dc [mos7840] |
| |
| Note that we continue to treat the interrupt-in endpoint as optional for |
| now. |
| |
| Fixes: 3f5429746d91 ("USB: Moschip 7840 USB-Serial Driver") |
| Signed-off-by: Johan Hovold <johan@kernel.org> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/usb/serial/mos7840.c | 12 ++++++++++++ |
| 1 file changed, 12 insertions(+) |
| |
| --- a/drivers/usb/serial/mos7840.c |
| +++ b/drivers/usb/serial/mos7840.c |
| @@ -2179,6 +2179,17 @@ static int mos7840_calc_num_ports(struct |
| return mos7840_num_ports; |
| } |
| |
| +static int mos7840_attach(struct usb_serial *serial) |
| +{ |
| + if (serial->num_bulk_in < serial->num_ports || |
| + serial->num_bulk_out < serial->num_ports) { |
| + dev_err(&serial->interface->dev, "missing endpoints\n"); |
| + return -ENODEV; |
| + } |
| + |
| + return 0; |
| +} |
| + |
| static int mos7840_port_probe(struct usb_serial_port *port) |
| { |
| struct usb_serial *serial = port->serial; |
| @@ -2457,6 +2468,7 @@ static struct usb_serial_driver moschip7 |
| .tiocmset = mos7840_tiocmset, |
| .tiocmiwait = usb_serial_generic_tiocmiwait, |
| .get_icount = usb_serial_generic_get_icount, |
| + .attach = mos7840_attach, |
| .port_probe = mos7840_port_probe, |
| .port_remove = mos7840_port_remove, |
| .read_bulk_callback = mos7840_bulk_in_callback, |