From 773a4ea5e1c4d425101f6488e58340973b396e8c Mon Sep 17 00:00:00 2001
From: Alex Jia <ajia@redhat.com>
Date: Wed, 30 Nov 2011 13:57:09 +0800
Subject: [PATCH] rpc: Plug memory leak on virNetClientSendInternal() error
 path

Detected by Coverity. Leak introduced in commit 673adba.

Two separate bugs here:
1. call was not freed on all error paths
2. virCondDestroy was called even if virCondInit failed

Signed-off-by: Alex Jia <ajia@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
---
 src/rpc/virnetclient.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c
index a738129623..5165c8d49d 100644
--- a/src/rpc/virnetclient.c
+++ b/src/rpc/virnetclient.c
@@ -1708,7 +1708,7 @@ static int virNetClientSendInternal(virNetClientPtr client,
     if (!client->sock || client->wantClose) {
         virNetError(VIR_ERR_INTERNAL_ERROR, "%s",
                     _("client socket is closed"));
-        goto unlock;
+        goto cleanup;
     }
 
     if (virCondInit(&call->cond) < 0) {
@@ -1729,16 +1729,16 @@ static int virNetClientSendInternal(virNetClientPtr client,
 
     ret = virNetClientIO(client, call);
 
-cleanup:
     /* If partially sent, then the call is still on the dispatch queue */
     if (ret == 1) {
         call->haveThread = false;
     } else {
         ignore_value(virCondDestroy(&call->cond));
-        VIR_FREE(call);
     }
 
-unlock:
+cleanup:
+    if (ret != 1)
+        VIR_FREE(call);
     virNetClientUnlock(client);
     return ret;
 }