[PATCH 2/3] Rework remoteSerializeDHCPLease

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]