Browse Source

[netdrvr/usb] hso_create_bulk_serial_device(): fix a double free

hso_serial_common_free() mustn't be called if
hso_serial_common_create() fails.

Reported-by: Adrian Bunk <bunk@kernel.org>
Signed-off-by: Adrian Bunk <bunk@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Adrian Bunk 16 years ago
parent
commit
e57b641dfa
1 changed files with 5 additions and 4 deletions
  1. 5 4
      drivers/net/usb/hso.c

+ 5 - 4
drivers/net/usb/hso.c

@@ -2211,14 +2211,14 @@ static struct hso_device *hso_create_bulk_serial_device(
 				     USB_DIR_IN);
 				     USB_DIR_IN);
 	if (!serial->in_endp) {
 	if (!serial->in_endp) {
 		dev_err(&interface->dev, "Failed to find BULK IN ep\n");
 		dev_err(&interface->dev, "Failed to find BULK IN ep\n");
-		goto exit;
+		goto exit2;
 	}
 	}
 
 
 	if (!
 	if (!
 	    (serial->out_endp =
 	    (serial->out_endp =
 	     hso_get_ep(interface, USB_ENDPOINT_XFER_BULK, USB_DIR_OUT))) {
 	     hso_get_ep(interface, USB_ENDPOINT_XFER_BULK, USB_DIR_OUT))) {
 		dev_err(&interface->dev, "Failed to find BULK IN ep\n");
 		dev_err(&interface->dev, "Failed to find BULK IN ep\n");
-		goto exit;
+		goto exit2;
 	}
 	}
 
 
 	serial->write_data = hso_std_serial_write_data;
 	serial->write_data = hso_std_serial_write_data;
@@ -2231,9 +2231,10 @@ static struct hso_device *hso_create_bulk_serial_device(
 
 
 	/* done, return it */
 	/* done, return it */
 	return hso_dev;
 	return hso_dev;
+
+exit2:
+	hso_serial_common_free(serial);
 exit:
 exit:
-	if (hso_dev && serial)
-		hso_serial_common_free(serial);
 	kfree(serial);
 	kfree(serial);
 	hso_free_device(hso_dev);
 	hso_free_device(hso_dev);
 	return NULL;
 	return NULL;