Skip to content

Commit

Permalink
USB: option: fix interface-data memory leak in error path
Browse files Browse the repository at this point in the history
Move interface data allocation to attach so that it is deallocated
should usb-serial probe fail.

Note that the usb device id is stored at probe so that it can be used
in attach to determine send-setup blacklisting.

Signed-off-by: Johan Hovold <jhovold@gmail.com>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Johan Hovold authored and Greg Kroah-Hartman committed Oct 25, 2012
1 parent a997448 commit c2dd4a8
Showing 1 changed file with 19 additions and 2 deletions.
21 changes: 19 additions & 2 deletions drivers/usb/serial/option.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
/* Function prototypes */
static int option_probe(struct usb_serial *serial,
const struct usb_device_id *id);
static int option_attach(struct usb_serial *serial);
static void option_release(struct usb_serial *serial);
static int option_send_setup(struct usb_serial_port *port);
static void option_instat_callback(struct urb *urb);
Expand Down Expand Up @@ -1288,6 +1289,7 @@ static struct usb_serial_driver option_1port_device = {
.tiocmget = usb_wwan_tiocmget,
.tiocmset = usb_wwan_tiocmset,
.ioctl = usb_wwan_ioctl,
.attach = option_attach,
.release = option_release,
.port_probe = usb_wwan_port_probe,
.port_remove = usb_wwan_port_remove,
Expand Down Expand Up @@ -1335,8 +1337,6 @@ static bool is_blacklisted(const u8 ifnum, enum option_blacklist_reason reason,
static int option_probe(struct usb_serial *serial,
const struct usb_device_id *id)
{
struct usb_wwan_intf_private *data;
struct option_private *priv;
struct usb_interface_descriptor *iface_desc =
&serial->interface->cur_altsetting->desc;
struct usb_device_descriptor *dev_desc = &serial->dev->descriptor;
Expand Down Expand Up @@ -1374,6 +1374,19 @@ static int option_probe(struct usb_serial *serial,
iface_desc->bInterfaceClass != USB_CLASS_CDC_DATA)
return -ENODEV;

/* Store device id so we can use it during attach. */
usb_set_serial_data(serial, (void *)id);

return 0;
}

static int option_attach(struct usb_serial *serial)
{
struct usb_interface_descriptor *iface_desc;
const struct usb_device_id *id;
struct usb_wwan_intf_private *data;
struct option_private *priv;

data = kzalloc(sizeof(struct usb_wwan_intf_private), GFP_KERNEL);
if (!data)
return -ENOMEM;
Expand All @@ -1384,6 +1397,10 @@ static int option_probe(struct usb_serial *serial,
return -ENOMEM;
}

/* Retrieve device id stored at probe. */
id = usb_get_serial_data(serial);
iface_desc = &serial->interface->cur_altsetting->desc;

priv->bInterfaceNumber = iface_desc->bInterfaceNumber;
data->private = priv;

Expand Down

0 comments on commit c2dd4a8

Please sign in to comment.