Don't leak the temporary variables on success if NULL is returned for that field. Don't dereference NULL on failure to allocate some of the temporaries. Introduced by commit 990c3b6 --- daemon/remote.c | 53 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index ae19b2a..9ffc1cb 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -6213,36 +6213,51 @@ remoteSerializeDHCPLease(remote_network_dhcp_lease *lease_dst, virNetworkDHCPLea char **hostname_tmp = NULL; char **clientid_tmp = NULL; - if (VIR_ALLOC(mac_tmp) < 0 || - VIR_ALLOC(iaid_tmp) < 0 || - VIR_ALLOC(hostname_tmp) < 0 || - VIR_ALLOC(clientid_tmp) < 0) - goto error; - lease_dst->expirytime = lease_src->expirytime; lease_dst->type = lease_src->type; lease_dst->prefix = lease_src->prefix; if (VIR_STRDUP(lease_dst->iface, lease_src->iface) < 0 || - VIR_STRDUP(lease_dst->ipaddr, lease_src->ipaddr) < 0 || - VIR_STRDUP(*mac_tmp, lease_src->mac) < 0 || - VIR_STRDUP(*iaid_tmp, lease_src->iaid) < 0 || - VIR_STRDUP(*hostname_tmp, lease_src->hostname) < 0 || - VIR_STRDUP(*clientid_tmp, lease_src->clientid) < 0) + VIR_STRDUP(lease_dst->ipaddr, lease_src->ipaddr) < 0) goto error; - lease_dst->mac = *mac_tmp ? mac_tmp : NULL; - lease_dst->iaid = *iaid_tmp ? iaid_tmp : NULL; - lease_dst->hostname = *hostname_tmp ? hostname_tmp : NULL; - lease_dst->clientid = *clientid_tmp ? clientid_tmp : NULL; + if (lease_src->mac) { + if (VIR_ALLOC(mac_tmp) < 0 || + VIR_STRDUP(*mac_tmp, lease_src->mac) < 0) + goto error; + } + if (lease_src->iaid) { + if (VIR_ALLOC(iaid_tmp) < 0 || + VIR_STRDUP(*iaid_tmp, lease_src->iaid) < 0) + goto error; + } + if (lease_src->hostname) { + if (VIR_ALLOC(hostname_tmp) < 0 || + VIR_STRDUP(*hostname_tmp, lease_src->hostname) < 0) + goto error; + } + if (lease_src->clientid) { + if (VIR_ALLOC(clientid_tmp) < 0 || + VIR_STRDUP(*clientid_tmp, lease_src->clientid) < 0) + goto error; + } + + lease_dst->mac = mac_tmp; + lease_dst->iaid = iaid_tmp; + lease_dst->hostname = hostname_tmp; + lease_dst->clientid = clientid_tmp; return 0; error: - VIR_FREE(*mac_tmp); - VIR_FREE(*iaid_tmp); - VIR_FREE(*hostname_tmp); - VIR_FREE(*clientid_tmp); + if (mac_tmp) + VIR_FREE(*mac_tmp); + if (iaid_tmp) + VIR_FREE(*iaid_tmp); + if (hostname_tmp) + VIR_FREE(*hostname_tmp); + if (clientid_tmp) + VIR_FREE(*clientid_tmp); VIR_FREE(mac_tmp); VIR_FREE(iaid_tmp); VIR_FREE(hostname_tmp); -- 1.8.5.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list