Commit 47d72de3 authored by Oliver Neukum's avatar Oliver Neukum Committed by Greg Kroah-Hartman

[PATCH] fix urb leak in error in cdc-ether

Probably leftover of statically allocated urbs.

fix memory leak
parent b2fb8f66
...@@ -1170,23 +1170,20 @@ static void * CDCEther_probe( struct usb_device *usb, unsigned int ifnum, ...@@ -1170,23 +1170,20 @@ static void * CDCEther_probe( struct usb_device *usb, unsigned int ifnum,
if (rc) { if (rc) {
// Nope we couldn't find one we liked. // Nope we couldn't find one we liked.
// This device was not meant for us to control. // This device was not meant for us to control.
kfree( ether_dev ); goto error_all;
return NULL;
} }
// Now that we FOUND a configuration. let's try to make the // Now that we FOUND a configuration. let's try to make the
// device go into it. // device go into it.
if ( usb_set_configuration( usb, ether_dev->bConfigurationValue ) ) { if ( usb_set_configuration( usb, ether_dev->bConfigurationValue ) ) {
err("usb_set_configuration() failed"); err("usb_set_configuration() failed");
kfree( ether_dev ); goto error_all;
return NULL;
} }
// Now set the communication interface up as required. // Now set the communication interface up as required.
if (usb_set_interface(usb, ether_dev->comm_bInterfaceNumber, ether_dev->comm_bAlternateSetting)) { if (usb_set_interface(usb, ether_dev->comm_bInterfaceNumber, ether_dev->comm_bAlternateSetting)) {
err("usb_set_interface() failed"); err("usb_set_interface() failed");
kfree( ether_dev ); goto error_all;
return NULL;
} }
// Only turn traffic on right now if we must... // Only turn traffic on right now if we must...
...@@ -1198,8 +1195,7 @@ static void * CDCEther_probe( struct usb_device *usb, unsigned int ifnum, ...@@ -1198,8 +1195,7 @@ static void * CDCEther_probe( struct usb_device *usb, unsigned int ifnum,
ether_dev->data_bInterfaceNumber, ether_dev->data_bInterfaceNumber,
ether_dev->data_bAlternateSetting_without_traffic)) { ether_dev->data_bAlternateSetting_without_traffic)) {
err("usb_set_interface() failed"); err("usb_set_interface() failed");
kfree( ether_dev ); goto error_all;
return NULL;
} }
} else { } else {
// We didn't find an alternate setting for the data // We didn't find an alternate setting for the data
...@@ -1209,8 +1205,7 @@ static void * CDCEther_probe( struct usb_device *usb, unsigned int ifnum, ...@@ -1209,8 +1205,7 @@ static void * CDCEther_probe( struct usb_device *usb, unsigned int ifnum,
ether_dev->data_bInterfaceNumber, ether_dev->data_bInterfaceNumber,
ether_dev->data_bAlternateSetting_with_traffic)) { ether_dev->data_bAlternateSetting_with_traffic)) {
err("usb_set_interface() failed"); err("usb_set_interface() failed");
kfree( ether_dev ); goto error_all;
return NULL;
} }
} }
...@@ -1220,8 +1215,7 @@ static void * CDCEther_probe( struct usb_device *usb, unsigned int ifnum, ...@@ -1220,8 +1215,7 @@ static void * CDCEther_probe( struct usb_device *usb, unsigned int ifnum,
// Hmm... The kernel is not sharing today... // Hmm... The kernel is not sharing today...
// Fine, we didn't want it anyway... // Fine, we didn't want it anyway...
err( "Unable to initialize ethernet device" ); err( "Unable to initialize ethernet device" );
kfree( ether_dev ); goto error_all;
return NULL;
} }
// Now that we have an ethernet device, let's set it up // Now that we have an ethernet device, let's set it up
...@@ -1265,6 +1259,14 @@ static void * CDCEther_probe( struct usb_device *usb, unsigned int ifnum, ...@@ -1265,6 +1259,14 @@ static void * CDCEther_probe( struct usb_device *usb, unsigned int ifnum,
// Okay, we are finally done... // Okay, we are finally done...
return NULL; return NULL;
// bailing out with our tail between our knees
error_all:
usb_free_urb(ether_dev->tx_urb);
usb_free_urb(ether_dev->rx_urb);
usb_free_urb(ether_dev->intr_urb);
kfree( ether_dev );
return NULL;
} }
......
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