Commit 53ad8bf0 authored by Johan Hovold's avatar Johan Hovold Committed by Jiri Slaby

USB: serial: io_edgeport: fix memory leaks in attach error path

commit c5c0c555 upstream.

Private data, URBs and buffers allocated for Epic devices during
attach were never released on errors (e.g. missing endpoints).

Fixes: 6e8cf775 ("USB: add EPIC support to the io_edgeport driver")
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
Acked-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
parent e78a0e1d
...@@ -2879,14 +2879,15 @@ static int edge_startup(struct usb_serial *serial) ...@@ -2879,14 +2879,15 @@ static int edge_startup(struct usb_serial *serial)
usb_alloc_urb(0, GFP_KERNEL); usb_alloc_urb(0, GFP_KERNEL);
if (!edge_serial->interrupt_read_urb) { if (!edge_serial->interrupt_read_urb) {
dev_err(ddev, "out of memory\n"); dev_err(ddev, "out of memory\n");
return -ENOMEM; response = -ENOMEM;
break;
} }
edge_serial->interrupt_in_buffer = edge_serial->interrupt_in_buffer =
kmalloc(buffer_size, GFP_KERNEL); kmalloc(buffer_size, GFP_KERNEL);
if (!edge_serial->interrupt_in_buffer) { if (!edge_serial->interrupt_in_buffer) {
dev_err(ddev, "out of memory\n"); dev_err(ddev, "out of memory\n");
usb_free_urb(edge_serial->interrupt_read_urb); response = -ENOMEM;
return -ENOMEM; break;
} }
edge_serial->interrupt_in_endpoint = edge_serial->interrupt_in_endpoint =
endpoint->bEndpointAddress; endpoint->bEndpointAddress;
...@@ -2916,14 +2917,15 @@ static int edge_startup(struct usb_serial *serial) ...@@ -2916,14 +2917,15 @@ static int edge_startup(struct usb_serial *serial)
usb_alloc_urb(0, GFP_KERNEL); usb_alloc_urb(0, GFP_KERNEL);
if (!edge_serial->read_urb) { if (!edge_serial->read_urb) {
dev_err(ddev, "out of memory\n"); dev_err(ddev, "out of memory\n");
return -ENOMEM; response = -ENOMEM;
break;
} }
edge_serial->bulk_in_buffer = edge_serial->bulk_in_buffer =
kmalloc(buffer_size, GFP_KERNEL); kmalloc(buffer_size, GFP_KERNEL);
if (!edge_serial->bulk_in_buffer) { if (!edge_serial->bulk_in_buffer) {
dev_err(&dev->dev, "out of memory\n"); dev_err(&dev->dev, "out of memory\n");
usb_free_urb(edge_serial->read_urb); response = -ENOMEM;
return -ENOMEM; break;
} }
edge_serial->bulk_in_endpoint = edge_serial->bulk_in_endpoint =
endpoint->bEndpointAddress; endpoint->bEndpointAddress;
...@@ -2949,9 +2951,22 @@ static int edge_startup(struct usb_serial *serial) ...@@ -2949,9 +2951,22 @@ static int edge_startup(struct usb_serial *serial)
} }
} }
if (!interrupt_in_found || !bulk_in_found || !bulk_out_found) { if (response || !interrupt_in_found || !bulk_in_found ||
dev_err(ddev, "Error - the proper endpoints were not found!\n"); !bulk_out_found) {
return -ENODEV; if (!response) {
dev_err(ddev, "expected endpoints not found\n");
response = -ENODEV;
}
usb_free_urb(edge_serial->interrupt_read_urb);
kfree(edge_serial->interrupt_in_buffer);
usb_free_urb(edge_serial->read_urb);
kfree(edge_serial->bulk_in_buffer);
kfree(edge_serial);
return response;
} }
/* start interrupt read for this edgeport this interrupt will /* start interrupt read for this edgeport this interrupt will
......
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