From 5adc6031fa60379719d4856001a7e32a6f0221aa Mon Sep 17 00:00:00 2001 From: Kyle DeFrancia Date: Thu, 4 Dec 2014 13:07:36 -0800 Subject: [PATCH] network: don't allow multiple dhcp sections This resolves: https://bugzilla.redhat.com/show_bug.cgi?id=907779 A element can exist in only one IPv4 address and one IPv6 address per network. This patch enforces that in virNetworkUpdate. --- src/conf/network_conf.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 0d09deff7f..ddb5c077b5 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -3508,6 +3508,30 @@ virNetworkIpDefByIndex(virNetworkDefPtr def, int parentIndex) return ipdef; } + +static int +virNetworkDefUpdateCheckMultiDHCP(virNetworkDefPtr def, + virNetworkIpDefPtr ipdef) +{ + int family = VIR_SOCKET_ADDR_FAMILY(&ipdef->address); + size_t i; + virNetworkIpDefPtr ip; + + for (i = 0; (ip = virNetworkDefGetIpByIndex(def, family, i)); i++) { + if (ip != ipdef) { + if (ip->nranges || ip->nhosts) { + virReportError(VIR_ERR_OPERATION_INVALID, + _("dhcp is supported only for a " + "single %s address on each network"), + (family == AF_INET) ? "IPv4" : "IPv6"); + return -1; + } + } + } + return 0; +} + + static int virNetworkDefUpdateIPDHCPHost(virNetworkDefPtr def, unsigned int command, @@ -3573,6 +3597,9 @@ virNetworkDefUpdateIPDHCPHost(virNetworkDefPtr def, } else if ((command == VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST) || (command == VIR_NETWORK_UPDATE_COMMAND_ADD_LAST)) { + if (virNetworkDefUpdateCheckMultiDHCP(def, ipdef) < 0) + goto cleanup; + /* log error if an entry with same name/address/ip already exists */ for (i = 0; i < ipdef->nhosts; i++) { if ((host.mac && @@ -3680,6 +3707,9 @@ virNetworkDefUpdateIPDHCPRange(virNetworkDefPtr def, if ((command == VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST) || (command == VIR_NETWORK_UPDATE_COMMAND_ADD_LAST)) { + if (virNetworkDefUpdateCheckMultiDHCP(def, ipdef) < 0) + goto cleanup; + if (i < ipdef->nranges) { char *startip = virSocketAddrFormat(&range.start); char *endip = virSocketAddrFormat(&range.end); -- GitLab