diff options
author | Chris Lund <docmax@gmail.com> | 2006-06-03 16:58:19 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-06-21 18:04:16 -0400 |
commit | bfd5df3c0cf65bdf10a3a00baff036cb096140f6 (patch) | |
tree | 3b7835253e0b1f03bc42e323fe3988ee407c0e11 /drivers | |
parent | 14f76cc7ab75b1c9db036dcd6b247e0dcc8952be (diff) |
[PATCH] USB: free allocated memory on io_edgeport startup memory failure
While an Edgeport is allocating individual port structures, if kmalloc
returns NULL, the serial structure is freed and -ENOMEM, but the ports
allocated before the failure are not freed. This patch addresses that
condition.
Signed-off-by: Christopher Lund <docmax@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/serial/io_edgeport.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c index c28f1f6902c3..ed976ab56684 100644 --- a/drivers/usb/serial/io_edgeport.c +++ b/drivers/usb/serial/io_edgeport.c | |||
@@ -2730,7 +2730,7 @@ static int edge_startup (struct usb_serial *serial) | |||
2730 | struct edgeport_serial *edge_serial; | 2730 | struct edgeport_serial *edge_serial; |
2731 | struct edgeport_port *edge_port; | 2731 | struct edgeport_port *edge_port; |
2732 | struct usb_device *dev; | 2732 | struct usb_device *dev; |
2733 | int i; | 2733 | int i, j; |
2734 | 2734 | ||
2735 | dev = serial->dev; | 2735 | dev = serial->dev; |
2736 | 2736 | ||
@@ -2794,6 +2794,10 @@ static int edge_startup (struct usb_serial *serial) | |||
2794 | edge_port = kmalloc (sizeof(struct edgeport_port), GFP_KERNEL); | 2794 | edge_port = kmalloc (sizeof(struct edgeport_port), GFP_KERNEL); |
2795 | if (edge_port == NULL) { | 2795 | if (edge_port == NULL) { |
2796 | dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__); | 2796 | dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__); |
2797 | for (j = 0; j < i; ++j) { | ||
2798 | kfree (usb_get_serial_port_data(serial->port[j])); | ||
2799 | usb_set_serial_port_data(serial->port[j], NULL); | ||
2800 | } | ||
2797 | usb_set_serial_data(serial, NULL); | 2801 | usb_set_serial_data(serial, NULL); |
2798 | kfree(edge_serial); | 2802 | kfree(edge_serial); |
2799 | return -ENOMEM; | 2803 | return -ENOMEM; |