From: Martin Kletzander Date: Thu, 9 Jul 2015 13:53:25 +0000 (+0200) Subject: network: Add another collision check into networkCheckRouteCollision X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=0e3ad241f3f421c23bbe2cbe11a70f8e9184dc65;p=people%2Fliuw%2Flibxenctrl-split%2Flibvirt.git network: Add another collision check into networkCheckRouteCollision The comment above that function says: "This function can be a lot more exhaustive, ...", so let's be. Check for collisions between routes in the system and static routes being added explicitly from the element of the network XML. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1094205 Signed-off-by: Martin Kletzander --- diff --git a/src/network/bridge_driver_linux.c b/src/network/bridge_driver_linux.c index e394dafb2..bd7508c96 100644 --- a/src/network/bridge_driver_linux.c +++ b/src/network/bridge_driver_linux.c @@ -69,6 +69,7 @@ int networkCheckRouteCollision(virNetworkDefPtr def) char iface[17], dest[128], mask[128]; unsigned int addr_val, mask_val; virNetworkIpDefPtr ipdef; + virNetworkRouteDefPtr routedef; int num; size_t i; @@ -123,6 +124,34 @@ int networkCheckRouteCollision(virNetworkDefPtr def) goto out; } } + + for (i = 0; + (routedef = virNetworkDefGetRouteByIndex(def, AF_INET, i)); + i++) { + + virSocketAddr r_mask, r_addr; + virSocketAddrPtr tmp_addr = virNetworkRouteDefGetAddress(routedef); + int r_prefix = virNetworkRouteDefGetPrefix(routedef); + + if (!tmp_addr || + virSocketAddrMaskByPrefix(tmp_addr, r_prefix, &r_addr) < 0 || + virSocketAddrPrefixToNetmask(r_prefix, &r_mask, AF_INET) < 0) + continue; + + if ((r_addr.data.inet4.sin_addr.s_addr == addr_val) && + (r_mask.data.inet4.sin_addr.s_addr == mask_val)) { + char *addr_str = virSocketAddrFormat(&r_addr); + if (!addr_str) + virResetLastError(); + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Route address '%s' conflicts " + "with IP address for '%s'"), + NULLSTR(addr_str), iface); + VIR_FREE(addr_str); + ret = -1; + goto out; + } + } } out: