This makes the range and static host array management in virNetworkDHCPDefParseXML() more similar to what is done in virNetworkDefUpdateIPDHCPRange() and virNetworkDefUpdateIPDHCPHost() - they use VIR_APPEND_ELEMENT rather than a combination of VIR_REALLOC_N() and separate incrementing of the array size. The one functional change here is that a memory leak of the contents of the last (unsuccessful) virNetworkDHCPHostDef was previously leaked in certain failure conditions, but it is now properly cleaned up. --- new in V2 src/conf/network_conf.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 31d4463..25b5b81 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -997,33 +997,32 @@ virNetworkDHCPDefParseXML(const char *networkName, xmlNodePtr node, virNetworkIpDefPtr def) { - + int ret = -1; xmlNodePtr cur; + virSocketAddrRange range; + virNetworkDHCPHostDef host; + + memset(&range, 0, sizeof(range)); + memset(&host, 0, sizeof(host)); cur = node->children; while (cur != NULL) { if (cur->type == XML_ELEMENT_NODE && xmlStrEqual(cur->name, BAD_CAST "range")) { - if (VIR_REALLOC_N(def->ranges, def->nranges + 1) < 0) - return -1; - if (virSocketAddrRangeParseXML(networkName, def, cur, - &def->ranges[def->nranges]) < 0) { - return -1; - } - def->nranges++; + if (virSocketAddrRangeParseXML(networkName, def, cur, &range) < 0) + goto cleanup; + if (VIR_APPEND_ELEMENT(def->ranges, def->nranges, range) < 0) + goto cleanup; } else if (cur->type == XML_ELEMENT_NODE && xmlStrEqual(cur->name, BAD_CAST "host")) { - if (VIR_REALLOC_N(def->hosts, def->nhosts + 1) < 0) - return -1; if (virNetworkDHCPHostDefParseXML(networkName, def, cur, - &def->hosts[def->nhosts], - false) < 0) { - return -1; - } - def->nhosts++; + &host, false) < 0) + goto cleanup; + if (VIR_APPEND_ELEMENT(def->hosts, def->nhosts, host) < 0) + goto cleanup; } else if (VIR_SOCKET_ADDR_IS_FAMILY(&def->address, AF_INET) && cur->type == XML_ELEMENT_NODE && @@ -1043,7 +1042,7 @@ virNetworkDHCPDefParseXML(const char *networkName, virSocketAddrParse(&inaddr, server, AF_UNSPEC) < 0) { VIR_FREE(file); VIR_FREE(server); - return -1; + goto cleanup; } def->bootfile = file; @@ -1054,7 +1053,10 @@ virNetworkDHCPDefParseXML(const char *networkName, cur = cur->next; } - return 0; + ret = 0; + cleanup: + virNetworkDHCPHostDefClear(&host); + return ret; } static int -- 2.1.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list