USB: serial: io_edgeport: fix memory leaks in attach error path
Private data, URBs and buffers allocated for Epic devices during
attach were never released on errors (e.g. missing endpoints).
Fixes: 6e8cf7751f
("USB: add EPIC support to the io_edgeport driver")
Cc: stable <stable@vger.kernel.org> # v2.6.21
Signed-off-by: Johan Hovold <johan@kernel.org>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
ab5701ada2
commit
c5c0c55598
|
@ -2849,14 +2849,16 @@ static int edge_startup(struct usb_serial *serial)
|
|||
/* not set up yet, so do it now */
|
||||
edge_serial->interrupt_read_urb =
|
||||
usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!edge_serial->interrupt_read_urb)
|
||||
return -ENOMEM;
|
||||
if (!edge_serial->interrupt_read_urb) {
|
||||
response = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
|
||||
edge_serial->interrupt_in_buffer =
|
||||
kmalloc(buffer_size, GFP_KERNEL);
|
||||
if (!edge_serial->interrupt_in_buffer) {
|
||||
usb_free_urb(edge_serial->interrupt_read_urb);
|
||||
return -ENOMEM;
|
||||
response = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
edge_serial->interrupt_in_endpoint =
|
||||
endpoint->bEndpointAddress;
|
||||
|
@ -2884,14 +2886,16 @@ static int edge_startup(struct usb_serial *serial)
|
|||
/* not set up yet, so do it now */
|
||||
edge_serial->read_urb =
|
||||
usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!edge_serial->read_urb)
|
||||
return -ENOMEM;
|
||||
if (!edge_serial->read_urb) {
|
||||
response = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
|
||||
edge_serial->bulk_in_buffer =
|
||||
kmalloc(buffer_size, GFP_KERNEL);
|
||||
if (!edge_serial->bulk_in_buffer) {
|
||||
usb_free_urb(edge_serial->read_urb);
|
||||
return -ENOMEM;
|
||||
response = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
edge_serial->bulk_in_endpoint =
|
||||
endpoint->bEndpointAddress;
|
||||
|
@ -2917,9 +2921,22 @@ static int edge_startup(struct usb_serial *serial)
|
|||
}
|
||||
}
|
||||
|
||||
if (!interrupt_in_found || !bulk_in_found || !bulk_out_found) {
|
||||
dev_err(ddev, "Error - the proper endpoints were not found!\n");
|
||||
return -ENODEV;
|
||||
if (response || !interrupt_in_found || !bulk_in_found ||
|
||||
!bulk_out_found) {
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue