[libvirt] [PATCHv2 01/17] conf: reorganize virNetworkDHCPDefParseXML
Laine Stump
laine at laine.org
Wed Jul 22 17:02:18 UTC 2015
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
More information about the libvir-list
mailing list