summaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/ipaq.c
diff options
context:
space:
mode:
authorOliver Neukum <oliver@neukum.org>2008-07-26 22:42:42 +0200
committerLinus Torvalds <torvalds@linux-foundation.org>2008-07-27 05:40:09 +0200
commit852fef69c0d9510a28a70221cfddd004efa02552 (patch)
tree3cc5a175ad181262926f0498a74054e482220088 /drivers/usb/serial/ipaq.c
parentMerge git://git.infradead.org/mtd-2.6 (diff)
downloadlinux-852fef69c0d9510a28a70221cfddd004efa02552.tar.xz
linux-852fef69c0d9510a28a70221cfddd004efa02552.zip
fix for a memory leak in an error case introduced by fix for double free
The fix NULLed a pointer without freeing it. Signed-off-by: Oliver Neukum <oneukum@suse.de> Reported-by: Juha Motorsportcom <juha_motorsportcom@luukku.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/usb/serial/ipaq.c')
-rw-r--r--drivers/usb/serial/ipaq.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c
index 832a5a4f3cb3..cd9a2e138c8b 100644
--- a/drivers/usb/serial/ipaq.c
+++ b/drivers/usb/serial/ipaq.c
@@ -651,15 +651,17 @@ static int ipaq_open(struct tty_struct *tty,
*/
kfree(port->bulk_in_buffer);
+ kfree(port->bulk_out_buffer);
+ /* make sure the generic serial code knows */
+ port->bulk_out_buffer = NULL;
+
port->bulk_in_buffer = kmalloc(URBDATA_SIZE, GFP_KERNEL);
- if (port->bulk_in_buffer == NULL) {
- port->bulk_out_buffer = NULL; /* prevent double free */
+ if (port->bulk_in_buffer == NULL)
goto enomem;
- }
- kfree(port->bulk_out_buffer);
port->bulk_out_buffer = kmalloc(URBDATA_SIZE, GFP_KERNEL);
if (port->bulk_out_buffer == NULL) {
+ /* the buffer is useless, free it */
kfree(port->bulk_in_buffer);
port->bulk_in_buffer = NULL;
goto enomem;