From 773a4ea5e1c4d425101f6488e58340973b396e8c Mon Sep 17 00:00:00 2001 From: Alex Jia 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 Signed-off-by: Eric Blake --- 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; }