]> xenbits.xensource.com Git - libvirt.git/commitdiff
virNetworkDefUpdateIPDHCPHost: Don't crash when updating network
authorMichal Privoznik <mprivozn@redhat.com>
Thu, 15 Jan 2015 14:42:04 +0000 (15:42 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Fri, 16 Jan 2015 08:57:05 +0000 (09:57 +0100)
https://bugzilla.redhat.com/show_bug.cgi?id=1182486

When updating a network and adding new ip-dhcp-host entry, the deamon
may crash. The problem is, we iterate over existing <host/> entries
trying to compare MAC addresses to see if there's already an existing
rule. However, not all entries are required to have MAC address. For
instance, the following is perfectly valid entry:

<host id='00:04:58:fd:e4:15:1b:09:4c:0e:09:af:e4:d3:8c:b8:ca:1e'
name='redhatipv6.redhat.com' ip='2001:db8:ca2:2::119'/>

When the checking loop iterates over this, the entry's MAC address is
accessed directly. Well, the fix is obvious - check if the address is
defined before trying to compare it.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
src/conf/network_conf.c

index 26fe18deef175d494525dd5e1d5280c5d87cd0df..a797264a19f91d9ca92546277ade2cce3a20c217 100644 (file)
@@ -3563,7 +3563,7 @@ virNetworkDefUpdateIPDHCPHost(virNetworkDefPtr def,
         /* search for the entry with this (ip|mac|name),
          * and update the IP+(mac|name) */
         for (i = 0; i < ipdef->nhosts; i++) {
-            if ((host.mac &&
+            if ((host.mac && ipdef->hosts[i].mac &&
                  !virMacAddrCompare(host.mac, ipdef->hosts[i].mac)) ||
                 (VIR_SOCKET_ADDR_VALID(&host.ip) &&
                  virSocketAddrEqual(&host.ip, &ipdef->hosts[i].ip)) ||
@@ -3601,7 +3601,7 @@ virNetworkDefUpdateIPDHCPHost(virNetworkDefPtr def,
 
         /* log error if an entry with same name/address/ip already exists */
         for (i = 0; i < ipdef->nhosts; i++) {
-            if ((host.mac &&
+            if ((host.mac && ipdef->hosts[i].mac &&
                  !virMacAddrCompare(host.mac, ipdef->hosts[i].mac)) ||
                 (host.name &&
                  STREQ_NULLABLE(host.name, ipdef->hosts[i].name)) ||
@@ -3630,7 +3630,7 @@ virNetworkDefUpdateIPDHCPHost(virNetworkDefPtr def,
 
         /* find matching entry - all specified attributes must match */
         for (i = 0; i < ipdef->nhosts; i++) {
-            if ((!host.mac ||
+            if ((!host.mac || !ipdef->hosts[i].mac ||
                  !virMacAddrCompare(host.mac, ipdef->hosts[i].mac)) &&
                 (!host.name ||
                  STREQ_NULLABLE(host.name, ipdef->hosts[i].name)) &&