From dd674689df647695f2326fe16040c0a3f05619f8 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Thu, 22 May 2008 15:12:25 +0000 Subject: [PATCH] Fix misc memory leaks --- ChangeLog | 9 +++++++++ qemud/remote.c | 25 ++++++++++++++++++++----- src/libvirt.c | 16 +++++++++------- src/qparams.c | 31 +++++++++++++------------------ 4 files changed, 51 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3039139d92..beaa5fa7af 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Thu May 22 11:06:29 EST 2008 Daniel P. Berrange + + Fix misc memory leaks + * qemud/remote.c: Fix memory leaks in stats/migration APIs + * src/libvirt.c: Fix use of uninitialized memory & memory + leak in default auth helper + * src/qparams.c: Fix memory leak, and convert to use new + style memory allocation APIs + Thu May 22 16:56:12 CEST 2008 Daniel Veillard * docs/formatdomain.html docs/formatdomain.html.in: Anton Protopopov diff --git a/qemud/remote.c b/qemud/remote.c index 725152e5ff..038c0aa067 100644 --- a/qemud/remote.c +++ b/qemud/remote.c @@ -792,8 +792,11 @@ remoteDispatchDomainBlockStats (struct qemud_server *server ATTRIBUTE_UNUSED, } path = args->path; - if (virDomainBlockStats (dom, path, &stats, sizeof stats) == -1) + if (virDomainBlockStats (dom, path, &stats, sizeof stats) == -1) { + virDomainFree (dom); return -1; + } + virDomainFree (dom); ret->rd_req = stats.rd_req; ret->rd_bytes = stats.rd_bytes; @@ -823,8 +826,11 @@ remoteDispatchDomainInterfaceStats (struct qemud_server *server ATTRIBUTE_UNUSED } path = args->path; - if (virDomainInterfaceStats (dom, path, &stats, sizeof stats) == -1) + if (virDomainInterfaceStats (dom, path, &stats, sizeof stats) == -1) { + virDomainFree (dom); return -1; + } + virDomainFree (dom); ret->rx_bytes = stats.rx_bytes; ret->rx_packets = stats.rx_packets; @@ -1221,14 +1227,22 @@ remoteDispatchDomainMigratePrepare (struct qemud_server *server ATTRIBUTE_UNUSED r = __virDomainMigratePrepare (client->conn, &cookie, &cookielen, uri_in, uri_out, args->flags, dname, args->resource); - if (r == -1) return -1; + if (r == -1) { + free(uri_out); + return -1; + } /* remoteDispatchClientRequest will free cookie, uri_out and * the string if there is one. */ ret->cookie.cookie_len = cookielen; ret->cookie.cookie_val = cookie; - ret->uri_out = *uri_out == NULL ? NULL : uri_out; + if (*uri_out == NULL) { + ret->uri_out = NULL; + free(uri_out); + } else { + ret->uri_out = uri_out; + } return 0; } @@ -1258,6 +1272,7 @@ remoteDispatchDomainMigratePerform (struct qemud_server *server ATTRIBUTE_UNUSED args->cookie.cookie_len, args->uri, args->flags, dname, args->resource); + virDomainFree (dom); if (r == -1) return -1; return 0; @@ -1281,7 +1296,7 @@ remoteDispatchDomainMigrateFinish (struct qemud_server *server ATTRIBUTE_UNUSED, if (ddom == NULL) return -1; make_nonnull_domain (&ret->ddom, ddom); - + virDomainFree (ddom); return 0; } diff --git a/src/libvirt.c b/src/libvirt.c index 9f6df8ebc3..6a5a01a809 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -170,13 +170,15 @@ static int virConnectAuthCallbackDefault(virConnectCredentialPtr cred, return -1; } - if (STREQ(bufptr, "") && cred[i].defresult) - cred[i].result = strdup(cred[i].defresult); - else - cred[i].result = strdup(bufptr); - if (!cred[i].result) - return -1; - cred[i].resultlen = strlen(cred[i].result); + if (cred[i].type != VIR_CRED_EXTERNAL) { + if (STREQ(bufptr, "") && cred[i].defresult) + cred[i].result = strdup(cred[i].defresult); + else + cred[i].result = strdup(bufptr); + if (!cred[i].result) + return -1; + cred[i].resultlen = strlen(cred[i].result); + } } return 0; diff --git a/src/qparams.c b/src/qparams.c index db2320e21f..88bf5c1571 100644 --- a/src/qparams.c +++ b/src/qparams.c @@ -27,7 +27,7 @@ #include #include "buf.h" - +#include "memory.h" #include "qparams.h" struct qparam_set * @@ -39,13 +39,12 @@ new_qparam_set (int init_alloc, ...) if (init_alloc <= 0) init_alloc = 1; - ps = malloc (sizeof (*ps)); - if (!ps) return NULL; + if (VIR_ALLOC(ps) < 0) + return NULL; ps->n = 0; ps->alloc = init_alloc; - ps->p = malloc (init_alloc * sizeof (ps->p[0])); - if (!ps->p) { - free (ps); + if (VIR_ALLOC_N(ps->p, ps->alloc) < 0) { + VIR_FREE (ps); return NULL; } @@ -87,13 +86,8 @@ append_qparams (struct qparam_set *ps, ...) static int grow_qparam_set (struct qparam_set *ps) { - struct qparam *old_p; - if (ps->n >= ps->alloc) { - old_p = ps->p; - ps->p = realloc (ps->p, 2 * ps->alloc * sizeof (ps->p[0])); - if (!ps->p) { - ps->p = old_p; + if (VIR_REALLOC_N(ps->p, ps->alloc * 2) < 0) { perror ("realloc"); return -1; } @@ -115,13 +109,13 @@ append_qparam (struct qparam_set *ps, pvalue = strdup (value); if (!pvalue) { - free (pname); + VIR_FREE (pname); return -1; } if (grow_qparam_set (ps) == -1) { - free (pname); - free (pvalue); + VIR_FREE (pname); + VIR_FREE (pvalue); return -1; } @@ -161,10 +155,11 @@ free_qparam_set (struct qparam_set *ps) int i; for (i = 0; i < ps->n; ++i) { - free (ps->p[i].name); - free (ps->p[i].value); + VIR_FREE (ps->p[i].name); + VIR_FREE (ps->p[i].value); } - free (ps); + VIR_FREE (ps->p); + VIR_FREE (ps); } struct qparam_set *