]> xenbits.xensource.com Git - libvirt.git/commitdiff
Set the number of elements 0 in virNetwork*Clear
authorJán Tomko <jtomko@redhat.com>
Fri, 26 Jul 2013 10:04:32 +0000 (12:04 +0200)
committerJán Tomko <jtomko@redhat.com>
Fri, 26 Jul 2013 10:50:34 +0000 (12:50 +0200)
Decrementing it when it was already 0 causes an invalid free
in virNetworkDefUpdateDNSHost if virNetworkDNSHostDefParseXML
fails and virNetworkDNSHostDefClear gets called twice.

virNetworkForwardDefClear left the number untouched even if it
freed all the elements.

src/conf/network_conf.c

index d616e12c7cc496c2bbb852a805228ffba1277921..490b04df9aa5dd100fdb2341738fb6a25d60d267 100644 (file)
@@ -134,8 +134,8 @@ virNetworkIpDefClear(virNetworkIpDefPtr def)
     VIR_FREE(def->family);
     VIR_FREE(def->ranges);
 
-    while (def->nhosts--)
-        virNetworkDHCPHostDefClear(&def->hosts[def->nhosts]);
+    while (def->nhosts)
+        virNetworkDHCPHostDefClear(&def->hosts[--def->nhosts]);
 
     VIR_FREE(def->hosts);
     VIR_FREE(def->tftproot);
@@ -158,8 +158,8 @@ virNetworkDNSTxtDefClear(virNetworkDNSTxtDefPtr def)
 static void
 virNetworkDNSHostDefClear(virNetworkDNSHostDefPtr def)
 {
-    while (def->nnames--)
-        VIR_FREE(def->names[def->nnames]);
+    while (def->nnames)
+        VIR_FREE(def->names[--def->nnames]);
     VIR_FREE(def->names);
 }
 
@@ -176,18 +176,18 @@ static void
 virNetworkDNSDefClear(virNetworkDNSDefPtr def)
 {
     if (def->txts) {
-        while (def->ntxts--)
-            virNetworkDNSTxtDefClear(&def->txts[def->ntxts]);
+        while (def->ntxts)
+            virNetworkDNSTxtDefClear(&def->txts[--def->ntxts]);
         VIR_FREE(def->txts);
     }
     if (def->hosts) {
-        while (def->nhosts--)
-            virNetworkDNSHostDefClear(&def->hosts[def->nhosts]);
+        while (def->nhosts)
+            virNetworkDNSHostDefClear(&def->hosts[--def->nhosts]);
         VIR_FREE(def->hosts);
     }
     if (def->srvs) {
-        while (def->nsrvs--)
-            virNetworkDNSSrvDefClear(&def->srvs[def->nsrvs]);
+        while (def->nsrvs)
+            virNetworkDNSSrvDefClear(&def->srvs[--def->nsrvs]);
         VIR_FREE(def->srvs);
     }
 }
@@ -206,6 +206,7 @@ virNetworkForwardDefClear(virNetworkForwardDefPtr def)
         virNetworkForwardIfDefClear(&def->ifs[i]);
     }
     VIR_FREE(def->ifs);
+    def->nifs = def->npfs = 0;
 }
 
 void