Fix misc memory leaks

This commit is contained in:
Daniel P. Berrange 2008-05-22 15:12:25 +00:00
parent 8e5c89ba64
commit dd674689df
4 changed files with 51 additions and 30 deletions

View File

@ -1,3 +1,12 @@
Thu May 22 11:06:29 EST 2008 Daniel P. Berrange <berrange@redhat.com>
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 <veillard@redhat.com> Thu May 22 16:56:12 CEST 2008 Daniel Veillard <veillard@redhat.com>
* docs/formatdomain.html docs/formatdomain.html.in: Anton Protopopov * docs/formatdomain.html docs/formatdomain.html.in: Anton Protopopov

View File

@ -792,8 +792,11 @@ remoteDispatchDomainBlockStats (struct qemud_server *server ATTRIBUTE_UNUSED,
} }
path = args->path; path = args->path;
if (virDomainBlockStats (dom, path, &stats, sizeof stats) == -1) if (virDomainBlockStats (dom, path, &stats, sizeof stats) == -1) {
virDomainFree (dom);
return -1; return -1;
}
virDomainFree (dom);
ret->rd_req = stats.rd_req; ret->rd_req = stats.rd_req;
ret->rd_bytes = stats.rd_bytes; ret->rd_bytes = stats.rd_bytes;
@ -823,8 +826,11 @@ remoteDispatchDomainInterfaceStats (struct qemud_server *server ATTRIBUTE_UNUSED
} }
path = args->path; path = args->path;
if (virDomainInterfaceStats (dom, path, &stats, sizeof stats) == -1) if (virDomainInterfaceStats (dom, path, &stats, sizeof stats) == -1) {
virDomainFree (dom);
return -1; return -1;
}
virDomainFree (dom);
ret->rx_bytes = stats.rx_bytes; ret->rx_bytes = stats.rx_bytes;
ret->rx_packets = stats.rx_packets; ret->rx_packets = stats.rx_packets;
@ -1221,14 +1227,22 @@ remoteDispatchDomainMigratePrepare (struct qemud_server *server ATTRIBUTE_UNUSED
r = __virDomainMigratePrepare (client->conn, &cookie, &cookielen, r = __virDomainMigratePrepare (client->conn, &cookie, &cookielen,
uri_in, uri_out, uri_in, uri_out,
args->flags, dname, args->resource); 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 /* remoteDispatchClientRequest will free cookie, uri_out and
* the string if there is one. * the string if there is one.
*/ */
ret->cookie.cookie_len = cookielen; ret->cookie.cookie_len = cookielen;
ret->cookie.cookie_val = cookie; 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; return 0;
} }
@ -1258,6 +1272,7 @@ remoteDispatchDomainMigratePerform (struct qemud_server *server ATTRIBUTE_UNUSED
args->cookie.cookie_len, args->cookie.cookie_len,
args->uri, args->uri,
args->flags, dname, args->resource); args->flags, dname, args->resource);
virDomainFree (dom);
if (r == -1) return -1; if (r == -1) return -1;
return 0; return 0;
@ -1281,7 +1296,7 @@ remoteDispatchDomainMigrateFinish (struct qemud_server *server ATTRIBUTE_UNUSED,
if (ddom == NULL) return -1; if (ddom == NULL) return -1;
make_nonnull_domain (&ret->ddom, ddom); make_nonnull_domain (&ret->ddom, ddom);
virDomainFree (ddom);
return 0; return 0;
} }

View File

@ -170,13 +170,15 @@ static int virConnectAuthCallbackDefault(virConnectCredentialPtr cred,
return -1; return -1;
} }
if (STREQ(bufptr, "") && cred[i].defresult) if (cred[i].type != VIR_CRED_EXTERNAL) {
cred[i].result = strdup(cred[i].defresult); if (STREQ(bufptr, "") && cred[i].defresult)
else cred[i].result = strdup(cred[i].defresult);
cred[i].result = strdup(bufptr); else
if (!cred[i].result) cred[i].result = strdup(bufptr);
return -1; if (!cred[i].result)
cred[i].resultlen = strlen(cred[i].result); return -1;
cred[i].resultlen = strlen(cred[i].result);
}
} }
return 0; return 0;

View File

@ -27,7 +27,7 @@
#include <stdarg.h> #include <stdarg.h>
#include "buf.h" #include "buf.h"
#include "memory.h"
#include "qparams.h" #include "qparams.h"
struct qparam_set * struct qparam_set *
@ -39,13 +39,12 @@ new_qparam_set (int init_alloc, ...)
if (init_alloc <= 0) init_alloc = 1; if (init_alloc <= 0) init_alloc = 1;
ps = malloc (sizeof (*ps)); if (VIR_ALLOC(ps) < 0)
if (!ps) return NULL; return NULL;
ps->n = 0; ps->n = 0;
ps->alloc = init_alloc; ps->alloc = init_alloc;
ps->p = malloc (init_alloc * sizeof (ps->p[0])); if (VIR_ALLOC_N(ps->p, ps->alloc) < 0) {
if (!ps->p) { VIR_FREE (ps);
free (ps);
return NULL; return NULL;
} }
@ -87,13 +86,8 @@ append_qparams (struct qparam_set *ps, ...)
static int static int
grow_qparam_set (struct qparam_set *ps) grow_qparam_set (struct qparam_set *ps)
{ {
struct qparam *old_p;
if (ps->n >= ps->alloc) { if (ps->n >= ps->alloc) {
old_p = ps->p; if (VIR_REALLOC_N(ps->p, ps->alloc * 2) < 0) {
ps->p = realloc (ps->p, 2 * ps->alloc * sizeof (ps->p[0]));
if (!ps->p) {
ps->p = old_p;
perror ("realloc"); perror ("realloc");
return -1; return -1;
} }
@ -115,13 +109,13 @@ append_qparam (struct qparam_set *ps,
pvalue = strdup (value); pvalue = strdup (value);
if (!pvalue) { if (!pvalue) {
free (pname); VIR_FREE (pname);
return -1; return -1;
} }
if (grow_qparam_set (ps) == -1) { if (grow_qparam_set (ps) == -1) {
free (pname); VIR_FREE (pname);
free (pvalue); VIR_FREE (pvalue);
return -1; return -1;
} }
@ -161,10 +155,11 @@ free_qparam_set (struct qparam_set *ps)
int i; int i;
for (i = 0; i < ps->n; ++i) { for (i = 0; i < ps->n; ++i) {
free (ps->p[i].name); VIR_FREE (ps->p[i].name);
free (ps->p[i].value); VIR_FREE (ps->p[i].value);
} }
free (ps); VIR_FREE (ps->p);
VIR_FREE (ps);
} }
struct qparam_set * struct qparam_set *