Patchwork [3.5.yuz,extended,stable] Patch "Drivers: hv: Cleanup error handling in vmbus_open()" has been added to staging queue

login
register
mail settings
Submitter Herton Ronaldo Krzesinski
Date Nov. 22, 2012, 4:49 a.m.
Message ID <1353559752-2931-1-git-send-email-herton.krzesinski@canonical.com>
Download mbox | patch
Permalink /patch/200991/
State New
Headers show

Comments

Herton Ronaldo Krzesinski - Nov. 22, 2012, 4:49 a.m.
This is a note to let you know that I have just added a patch titled

    Drivers: hv: Cleanup error handling in vmbus_open()

to the linux-3.5.y-queue branch of the 3.5.yuz extended stable tree 
which can be found at:

 http://kernel.ubuntu.com/git?p=ubuntu/linux.git;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.yuz tree, see
https://wiki.ubuntu.com/Kernel/Dev/ExtendedStable

Thanks.
-Herton

------

From 6f2a5448f48f9beca2023147140ef7ff9c7234dc Mon Sep 17 00:00:00 2001
From: "K. Y. Srinivasan" <kys@microsoft.com>
Date: Fri, 12 Oct 2012 13:22:42 -0700
Subject: [PATCH] Drivers: hv: Cleanup error handling in vmbus_open()

commit 1392550240aaa72ce3a094a38bd23525cd67ce60 upstream.

Fix a memory leak  in the error handling path in the function vmbus_open().

Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
Reported-by: Jason Wang <jasowang@redhat.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com>
---
 drivers/hv/channel.c |   24 +++++++++++++-----------
 1 file changed, 13 insertions(+), 11 deletions(-)

--
1.7.9.5

Patch

diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c
index 4065374..f4c3d28 100644
--- a/drivers/hv/channel.c
+++ b/drivers/hv/channel.c
@@ -146,14 +146,14 @@  int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,

 	if (ret != 0) {
 		err = ret;
-		goto errorout;
+		goto error0;
 	}

 	ret = hv_ringbuffer_init(
 		&newchannel->inbound, in, recv_ringbuffer_size);
 	if (ret != 0) {
 		err = ret;
-		goto errorout;
+		goto error0;
 	}


@@ -168,7 +168,7 @@  int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,

 	if (ret != 0) {
 		err = ret;
-		goto errorout;
+		goto error0;
 	}

 	/* Create and init the channel open message */
@@ -177,7 +177,7 @@  int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
 			   GFP_KERNEL);
 	if (!open_info) {
 		err = -ENOMEM;
-		goto errorout;
+		goto error0;
 	}

 	init_completion(&open_info->waitevent);
@@ -193,7 +193,7 @@  int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,

 	if (userdatalen > MAX_USER_DEFINED_BYTES) {
 		err = -EINVAL;
-		goto errorout;
+		goto error0;
 	}

 	if (userdatalen)
@@ -208,19 +208,18 @@  int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
 			       sizeof(struct vmbus_channel_open_channel));

 	if (ret != 0)
-		goto cleanup;
+		goto error1;

 	t = wait_for_completion_timeout(&open_info->waitevent, 5*HZ);
 	if (t == 0) {
 		err = -ETIMEDOUT;
-		goto errorout;
+		goto error1;
 	}


 	if (open_info->response.open_result.status)
 		err = open_info->response.open_result.status;

-cleanup:
 	spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
 	list_del(&open_info->msglistentry);
 	spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
@@ -228,9 +227,12 @@  cleanup:
 	kfree(open_info);
 	return err;

-errorout:
-	hv_ringbuffer_cleanup(&newchannel->outbound);
-	hv_ringbuffer_cleanup(&newchannel->inbound);
+error1:
+	spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
+	list_del(&open_info->msglistentry);
+	spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
+
+error0:
 	free_pages((unsigned long)out,
 		get_order(send_ringbuffer_size + recv_ringbuffer_size));
 	kfree(open_info);