[libvirt] [PATCH] network: plug memory leak
Stefan Berger
stefanb at linux.vnet.ibm.com
Tue Jan 11 02:01:23 UTC 2011
On 01/10/2011 05:38 PM, Eric Blake wrote:
> * src/conf/network_conf.c (virNetworkDefParseXML): Release ipNodes.
> ---
>
> Another memleak found by valgrind; shown with additional context
> to make review easier.
>
> src/conf/network_conf.c | 4 +++-
> 1 files changed, 3 insertions(+), 1 deletions(-)
>
> diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
> index abe91b5..28a3ee8 100644
> --- a/src/conf/network_conf.c
> +++ b/src/conf/network_conf.c
> @@ -1,22 +1,22 @@
> /*
> * network_conf.c: network XML handling
> *
> - * Copyright (C) 2006-2010 Red Hat, Inc.
> + * Copyright (C) 2006-2011 Red Hat, Inc.
> * Copyright (C) 2006-2008 Daniel P. Berrange
> *
> * This library is free software; you can redistribute it and/or
> * modify it under the terms of the GNU Lesser General Public
> * License as published by the Free Software Foundation; either
> * version 2.1 of the License, or (at your option) any later version.
> *
> * This library is distributed in the hope that it will be useful,
> * but WITHOUT ANY WARRANTY; without even the implied warranty of
> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> * Lesser General Public License for more details.
> *
> * You should have received a copy of the GNU Lesser General Public
> * License along with this library; if not, write to the Free Software
> * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
> *
> * Author: Daniel P. Berrange<berrange at redhat.com>
> */
> @@ -631,67 +631,69 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
> nIps = virXPathNodeSet("./ip", ctxt,&ipNodes);
> if (nIps> 0) {
> int ii;
>
> /* allocate array to hold all the addrs */
> if (VIR_ALLOC_N(def->ips, nIps)< 0) {
> virReportOOMError();
> goto error;
> }
> /* parse each addr */
> for (ii = 0; ii< nIps; ii++) {
> int ret = virNetworkIPParseXML(def->name,&def->ips[ii],
> ipNodes[ii], ctxt);
> if (ret< 0)
> goto error;
> def->nips++;
> }
> }
> + VIR_FREE(ipNodes);
>
> /* IPv4 forwarding setup */
> if (virXPathBoolean("count(./forward)> 0", ctxt)) {
> if (def->nips == 0) {
> virNetworkReportError(VIR_ERR_INTERNAL_ERROR,
> "%s", _("Forwarding requested, but no IP address provided"));
> goto error;
> }
> tmp = virXPathString("string(./forward[1]/@mode)", ctxt);
> if (tmp) {
> if ((def->forwardType = virNetworkForwardTypeFromString(tmp))< 0) {
> virNetworkReportError(VIR_ERR_INTERNAL_ERROR,
> _("unknown forwarding type '%s'"), tmp);
> VIR_FREE(tmp);
> goto error;
> }
> VIR_FREE(tmp);
> } else {
> def->forwardType = VIR_NETWORK_FORWARD_NAT;
> }
>
>
> def->forwardDev = virXPathString("string(./forward[1]/@dev)", ctxt);
> } else {
> def->forwardType = VIR_NETWORK_FORWARD_NONE;
> }
>
> return def;
>
> error:
> virNetworkDefFree(def);
> + VIR_FREE(ipNodes);
> return NULL;
> }
>
> static virNetworkDefPtr
> virNetworkDefParse(const char *xmlStr,
> const char *filename)
> {
> xmlDocPtr xml;
> virNetworkDefPtr def = NULL;
>
> if ((xml = virXMLParse(filename, xmlStr, "network.xml"))) {
> def = virNetworkDefParseNode(xml, xmlDocGetRootElement(xml));
> xmlFreeDoc(xml);
> }
>
> return def;
> }
>
ACK
More information about the libvir-list
mailing list