[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [PATCH] network: plug memory leak



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 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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]