]> xenbits.xensource.com Git - people/dariof/libvirt.git/commitdiff
Resolve valgrind error in virNetDevVlanParse()
authorJohn Ferlan <jferlan@redhat.com>
Fri, 28 Jun 2013 16:04:37 +0000 (12:04 -0400)
committerJohn Ferlan <jferlan@redhat.com>
Sat, 29 Jun 2013 09:54:11 +0000 (05:54 -0400)
Commit '861d4056' introduced the following:

TEST: networkxml2xmltest
      ..................                       18  OK
==25504== 7 bytes in 1 blocks are definitely lost in loss record 5 of 23
==25504==    at 0x4A0887C: malloc (vg_replace_malloc.c:270)
==25504==    by 0x37C1085D71: strdup (strdup.c:42)
==25504==    by 0x4CB835F: virStrdup (virstring.c:546)
==25504==    by 0x4CC5179: virXPathString (virxml.c:90)
==25504==    by 0x4CC75C2: virNetDevVlanParse (netdev_vlan_conf.c:78)
==25504==    by 0x4CF928A: virNetworkPortGroupParseXML (network_conf.c:1555)
==25504==    by 0x4CFE385: virNetworkDefParseXML (network_conf.c:2049)
==25504==    by 0x4D0113B: virNetworkDefParseNode (network_conf.c:2273)
==25504==    by 0x4D01254: virNetworkDefParse (network_conf.c:2234)
==25504==    by 0x401E80: testCompareXMLToXMLHelper (networkxml2xmltest.c:32)
==25504==    by 0x402D4F: virtTestRun (testutils.c:158)
==25504==    by 0x401CE9: mymain (networkxml2xmltest.c:110)
==25504==
PASS: networkxml2xmltest

Also changed the label from error to cleanup and adjusted code since it's
all one exit path

src/conf/netdev_vlan_conf.c

index 82ff9e8b658961e9fd5a7be0c7c25e3be459d232..880a7ce99c997bb92cb4bce031722c67a6f9dafc 100644 (file)
@@ -45,18 +45,18 @@ virNetDevVlanParse(xmlNodePtr node, xmlXPathContextPtr ctxt, virNetDevVlanPtr de
 
     nTags = virXPathNodeSet("./tag", ctxt, &tagNodes);
     if (nTags < 0)
-        goto error;
+        goto cleanup;
 
     if (nTags == 0) {
         virReportError(VIR_ERR_XML_ERROR, "%s",
                        _("missing tag id - each <vlan> must have "
                          "at least one <tag id='n'/> subelement"));
-        goto error;
+        goto cleanup;
     }
 
     if (VIR_ALLOC_N(def->tag, nTags) < 0) {
         virReportOOMError();
-        goto error;
+        goto cleanup;
     }
 
     def->nativeMode = 0;
@@ -68,18 +68,18 @@ virNetDevVlanParse(xmlNodePtr node, xmlXPathContextPtr ctxt, virNetDevVlanPtr de
         if (virXPathULong("string(./@id)", ctxt, &id) < 0) {
             virReportError(VIR_ERR_XML_ERROR, "%s",
                            _("missing or invalid vlan tag id attribute"));
-            goto error;
+            goto cleanup;
         }
         if (id > 4095) {
             virReportError(VIR_ERR_XML_ERROR,
                            _("vlan tag id %lu too large (maximum 4095)"), id);
-            goto error;
+            goto cleanup;
         }
         if ((nativeMode = virXPathString("string(./@nativeMode)", ctxt))) {
             if (def->nativeMode != 0) {
                 virReportError(VIR_ERR_XML_ERROR, "%s",
                                _("duplicate native vlan setting"));
-                goto error;
+                goto cleanup;
             }
             if ((def->nativeMode
                  = virNativeVlanModeTypeFromString(nativeMode)) <= 0) {
@@ -87,8 +87,9 @@ virNetDevVlanParse(xmlNodePtr node, xmlXPathContextPtr ctxt, virNetDevVlanPtr de
                                _("Invalid \"nativeMode='%s'\" "
                                  "in vlan <tag> element"),
                                nativeMode);
-                goto error;
+                goto cleanup;
             }
+            VIR_FREE(nativeMode);
             def->nativeTag = id;
         }
         def->tag[ii] = id;
@@ -110,29 +111,30 @@ virNetDevVlanParse(xmlNodePtr node, xmlXPathContextPtr ctxt, virNetDevVlanPtr de
                 virReportError(VIR_ERR_XML_ERROR,
                                _("invalid \"trunk='%s'\" in <vlan> - trunk='yes' "
                                  "is required for more than one vlan tag"), trunk);
-                goto error;
+                goto cleanup;
             }
             if (def->nativeMode != 0) {
                 virReportError(VIR_ERR_XML_ERROR, "%s",
                                _("invalid configuration in <vlan> - \"trunk='no'\" is "
                                  "not allowed with a native vlan id"));
-                goto error;
+                goto cleanup;
             }
             /* allow (but discard) "trunk='no' if there is a single tag */
             if (STRCASENEQ(trunk, "no")) {
                 virReportError(VIR_ERR_XML_ERROR,
                                _("invalid \"trunk='%s'\" in <vlan> "
                                  "- must be yes or no"), trunk);
-                goto error;
+                goto cleanup;
             }
         }
     }
 
     ret = 0;
-error:
+cleanup:
     ctxt->node = save;
     VIR_FREE(tagNodes);
     VIR_FREE(trunk);
+    VIR_FREE(nativeMode);
     if (ret < 0)
         virNetDevVlanClear(def);
     return ret;