From 1e20b80a91099a6d96a51590e760c1bf9b9ccab2 Mon Sep 17 00:00:00 2001 From: Mark McLoughlin Date: Tue, 20 Feb 2007 17:51:41 +0000 Subject: [PATCH] Fri Feb 20 17:49:22 IST 2007 Mark McLoughlin Fix a few leaks * qemud/qemud.c: qemudCleanup(): free the socket structures * qemud/conf.c: fix various leaks in the xml parsing * qemud/iptables.c: fix a typo causing a leak --- ChangeLog | 11 +++++++++++ include/libvirt/libvirt.h | 10 ++++++++++ qemud/conf.c | 6 ++++-- qemud/iptables.c | 4 ++-- qemud/qemud.c | 11 +++++++++-- 5 files changed, 36 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 47983c80ea..308a8c6340 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +Fri Feb 20 17:49:22 IST 2007 Mark McLoughlin + + Fix a few leaks + + * qemud/qemud.c: qemudCleanup(): free the socket + structures + + * qemud/conf.c: fix various leaks in the xml parsing + + * qemud/iptables.c: fix a typo causing a leak + Fri Feb 20 16:49:53 IST 2007 Mark McLoughlin * qemud/conf.c, qemud/qemud.c: only create config dirs diff --git a/include/libvirt/libvirt.h b/include/libvirt/libvirt.h index ee28d7f09a..ce24f59fc0 100644 --- a/include/libvirt/libvirt.h +++ b/include/libvirt/libvirt.h @@ -328,6 +328,11 @@ int virConnectListDefinedDomains (virConnectPtr conn, int maxnames); int virDomainCreate (virDomainPtr domain); +int virDomainGetAutostart (virDomainPtr domain, + int *autostart); +int virDomainSetAutostart (virDomainPtr domain, + int autostart); + /** * virVcpuInfo: structure for information about a virtual CPU in a domain. */ @@ -528,6 +533,11 @@ char * virNetworkGetXMLDesc (virNetworkPtr network, int flags); char * virNetworkGetBridgeName (virNetworkPtr network); +int virNetworkGetAutostart (virNetworkPtr network, + int *autostart); +int virNetworkSetAutostart (virNetworkPtr network, + int autostart); + #ifdef __cplusplus } #endif diff --git a/qemud/conf.c b/qemud/conf.c index b4f76f0893..71474302d4 100644 --- a/qemud/conf.c +++ b/qemud/conf.c @@ -651,6 +651,7 @@ static struct qemud_vm_def *qemudParseXML(struct qemud_server *server, (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr == 1)) { def->features |= QEMUD_FEATURE_ACPI; } + xmlXPathFreeObject(obj); /* Extract OS type info */ obj = xmlXPathEval(BAD_CAST "string(/domain/os/type[1])", ctxt); @@ -794,8 +795,7 @@ static struct qemud_vm_def *qemudParseXML(struct qemud_server *server, if ((obj == NULL) || (obj->type != XPATH_NODESET) || (obj->nodesetval == NULL) || (obj->nodesetval->nodeNr == 0)) { def->graphicsType = QEMUD_GRAPHICS_NONE; - } else { - prop = xmlGetProp(obj->nodesetval->nodeTab[0], BAD_CAST "type"); + } else if ((prop = xmlGetProp(obj->nodesetval->nodeTab[0], BAD_CAST "type"))) { if (!strcmp((char *)prop, "vnc")) { def->graphicsType = QEMUD_GRAPHICS_VNC; prop = xmlGetProp(obj->nodesetval->nodeTab[0], BAD_CAST "port"); @@ -811,7 +811,9 @@ static struct qemud_vm_def *qemudParseXML(struct qemud_server *server, qemudReportError(server, VIR_ERR_INTERNAL_ERROR, "Unsupported graphics type %s", prop); goto error; } + xmlFree(prop); } + xmlXPathFreeObject(obj); /* analysis of the disk devices */ obj = xmlXPathEval(BAD_CAST "/domain/devices/disk", ctxt); diff --git a/qemud/iptables.c b/qemud/iptables.c index bd7c9cf6cc..366b2dee0c 100644 --- a/qemud/iptables.c +++ b/qemud/iptables.c @@ -231,8 +231,8 @@ static void iptRulesFree(iptRules *rules) { if (rules->table) { - free(rules->chain); - rules->chain = NULL; + free(rules->table); + rules->table = NULL; } if (rules->chain) { diff --git a/qemud/qemud.c b/qemud/qemud.c index 79ce4db928..1715d6f987 100644 --- a/qemud/qemud.c +++ b/qemud/qemud.c @@ -1483,16 +1483,23 @@ static int qemudRunLoop(struct qemud_server *server, int timeout) { } static void qemudCleanup(struct qemud_server *server) { - struct qemud_socket *sock = server->sockets; + struct qemud_socket *sock; + close(server->sigread); + + sock = server->sockets; while (sock) { + struct qemud_socket *next = sock->next; close(sock->fd); - sock = sock->next; + free(sock); + sock = next; } + if (server->brctl) brShutdown(server->brctl); if (server->iptables) iptablesContextFree(server->iptables); + free(server); }