Commit 7bdce718 authored by Johan Hovold's avatar Johan Hovold Committed by Greg Kroah-Hartman

USB: ark3116: fix NULL-pointer dereference

Fix NULL-pointer dereference at release by replacing attach and release
with port_probe and port_remove.

Since commit 0998d063 (device-core: Ensure drvdata = NULL when no
driver is bound) the port private data is NULL when release is called.

Compile-only tested.

Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarJohan Hovold <jhovold@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8282da47
...@@ -125,9 +125,6 @@ static inline int calc_divisor(int bps) ...@@ -125,9 +125,6 @@ static inline int calc_divisor(int bps)
static int ark3116_attach(struct usb_serial *serial) static int ark3116_attach(struct usb_serial *serial)
{ {
struct usb_serial_port *port = serial->port[0];
struct ark3116_private *priv;
/* make sure we have our end-points */ /* make sure we have our end-points */
if ((serial->num_bulk_in == 0) || if ((serial->num_bulk_in == 0) ||
(serial->num_bulk_out == 0) || (serial->num_bulk_out == 0) ||
...@@ -142,8 +139,15 @@ static int ark3116_attach(struct usb_serial *serial) ...@@ -142,8 +139,15 @@ static int ark3116_attach(struct usb_serial *serial)
return -EINVAL; return -EINVAL;
} }
priv = kzalloc(sizeof(struct ark3116_private), return 0;
GFP_KERNEL); }
static int ark3116_port_probe(struct usb_serial_port *port)
{
struct usb_serial *serial = port->serial;
struct ark3116_private *priv;
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
if (!priv) if (!priv)
return -ENOMEM; return -ENOMEM;
...@@ -198,18 +202,15 @@ static int ark3116_attach(struct usb_serial *serial) ...@@ -198,18 +202,15 @@ static int ark3116_attach(struct usb_serial *serial)
return 0; return 0;
} }
static void ark3116_release(struct usb_serial *serial) static int ark3116_port_remove(struct usb_serial_port *port)
{ {
struct usb_serial_port *port = serial->port[0];
struct ark3116_private *priv = usb_get_serial_port_data(port); struct ark3116_private *priv = usb_get_serial_port_data(port);
/* device is closed, so URBs and DMA should be down */ /* device is closed, so URBs and DMA should be down */
usb_set_serial_port_data(port, NULL);
mutex_destroy(&priv->hw_lock); mutex_destroy(&priv->hw_lock);
kfree(priv); kfree(priv);
return 0;
} }
static void ark3116_init_termios(struct tty_struct *tty) static void ark3116_init_termios(struct tty_struct *tty)
...@@ -723,7 +724,8 @@ static struct usb_serial_driver ark3116_device = { ...@@ -723,7 +724,8 @@ static struct usb_serial_driver ark3116_device = {
.id_table = id_table, .id_table = id_table,
.num_ports = 1, .num_ports = 1,
.attach = ark3116_attach, .attach = ark3116_attach,
.release = ark3116_release, .port_probe = ark3116_port_probe,
.port_remove = ark3116_port_remove,
.set_termios = ark3116_set_termios, .set_termios = ark3116_set_termios,
.init_termios = ark3116_init_termios, .init_termios = ark3116_init_termios,
.ioctl = ark3116_ioctl, .ioctl = ark3116_ioctl,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment