From babb57aa85c348ab5a9cbfad6e69c85f611e75e4 Mon Sep 17 00:00:00 2001 From: John Ferlan Date: Fri, 28 Jun 2013 12:04:37 -0400 Subject: [PATCH] Resolve valgrind error in virNetDevVlanParse() 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 | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/conf/netdev_vlan_conf.c b/src/conf/netdev_vlan_conf.c index 82ff9e8b65..880a7ce99c 100644 --- a/src/conf/netdev_vlan_conf.c +++ b/src/conf/netdev_vlan_conf.c @@ -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 must have " "at least one 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 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 - 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 - \"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 " "- 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; -- 2.47.2