From: Ján Tomko Date: Tue, 24 Jun 2014 12:37:55 +0000 (+0200) Subject: Rework remoteSerializeDHCPLease X-Git-Tag: v1.2.6-rc1~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=364586d3ed2fae54dfc80a557228165f68d219ad;p=thirdparty%2Flibvirt.git Rework remoteSerializeDHCPLease 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 --- diff --git a/daemon/remote.c b/daemon/remote.c index ae19b2a7ab..9ffc1cb8c7 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);