
On 07/17/2015 02:43 PM, Laine Stump wrote:
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
Heh. I just noticed that this patch sneaked in. It's actually not a part of the PCI controller series, but was sitting on the same branch. I wouldn't mind pushing it if someone wants to review it, but it isn't at all urgent.
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