From: Michal Privoznik Date: Thu, 15 Jan 2015 14:42:04 +0000 (+0100) Subject: virNetworkDefUpdateIPDHCPHost: Don't crash when updating network X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=7d3ae359db604f6052247ad49d7fbce1db7ef99c;p=libvirt.git virNetworkDefUpdateIPDHCPHost: Don't crash when updating network 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 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: 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 --- diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 26fe18deef..a797264a19 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -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)) &&