render / rpms / libvirt

Forked from rpms/libvirt 9 months ago
Clone
9119d9
From 1711b9ad32a5ebc2349ef36e76dc0e3bcae4a6ac Mon Sep 17 00:00:00 2001
9119d9
Message-Id: <1711b9ad32a5ebc2349ef36e76dc0e3bcae4a6ac@dist-git>
9119d9
From: Michal Privoznik <mprivozn@redhat.com>
9119d9
Date: Fri, 16 Jan 2015 10:03:26 +0100
9119d9
Subject: [PATCH] virNetworkDefUpdateIPDHCPHost: Don't crash when updating
9119d9
 network
9119d9
9119d9
https://bugzilla.redhat.com/show_bug.cgi?id=1182486
9119d9
9119d9
When updating a network and adding new ip-dhcp-host entry, the deamon
9119d9
may crash. The problem is, we iterate over existing <host/> entries
9119d9
trying to compare MAC addresses to see if there's already an existing
9119d9
rule. However, not all entries are required to have MAC address. For
9119d9
instance, the following is perfectly valid entry:
9119d9
9119d9
9119d9
name='redhatipv6.redhat.com' ip='2001:db8:ca2:2::119'/>
9119d9
9119d9
When the checking loop iterates over this, the entry's MAC address is
9119d9
accessed directly. Well, the fix is obvious - check if the address is
9119d9
defined before trying to compare it.
9119d9
9119d9
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
9119d9
(cherry picked from commit 7d3ae359db604f6052247ad49d7fbce1db7ef99c)
9119d9
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
9119d9
---
9119d9
 src/conf/network_conf.c | 6 +++---
9119d9
 1 file changed, 3 insertions(+), 3 deletions(-)
9119d9
9119d9
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
9119d9
index 7b19592..73cca4c 100644
9119d9
--- a/src/conf/network_conf.c
9119d9
+++ b/src/conf/network_conf.c
9119d9
@@ -3550,7 +3550,7 @@ virNetworkDefUpdateIPDHCPHost(virNetworkDefPtr def,
9119d9
         /* search for the entry with this (ip|mac|name),
9119d9
          * and update the IP+(mac|name) */
9119d9
         for (i = 0; i < ipdef->nhosts; i++) {
9119d9
-            if ((host.mac &&
9119d9
+            if ((host.mac && ipdef->hosts[i].mac &&
9119d9
                  !virMacAddrCompare(host.mac, ipdef->hosts[i].mac)) ||
9119d9
                 (VIR_SOCKET_ADDR_VALID(&host.ip) &&
9119d9
                  virSocketAddrEqual(&host.ip, &ipdef->hosts[i].ip)) ||
9119d9
@@ -3585,7 +3585,7 @@ virNetworkDefUpdateIPDHCPHost(virNetworkDefPtr def,
9119d9
 
9119d9
         /* log error if an entry with same name/address/ip already exists */
9119d9
         for (i = 0; i < ipdef->nhosts; i++) {
9119d9
-            if ((host.mac &&
9119d9
+            if ((host.mac && ipdef->hosts[i].mac &&
9119d9
                  !virMacAddrCompare(host.mac, ipdef->hosts[i].mac)) ||
9119d9
                 (host.name &&
9119d9
                  STREQ_NULLABLE(host.name, ipdef->hosts[i].name)) ||
9119d9
@@ -3614,7 +3614,7 @@ virNetworkDefUpdateIPDHCPHost(virNetworkDefPtr def,
9119d9
 
9119d9
         /* find matching entry - all specified attributes must match */
9119d9
         for (i = 0; i < ipdef->nhosts; i++) {
9119d9
-            if ((!host.mac ||
9119d9
+            if ((!host.mac || !ipdef->hosts[i].mac ||
9119d9
                  !virMacAddrCompare(host.mac, ipdef->hosts[i].mac)) &&
9119d9
                 (!host.name ||
9119d9
                  STREQ_NULLABLE(host.name, ipdef->hosts[i].name)) &&
9119d9
-- 
9119d9
2.2.1
9119d9