From 6fd030cbf2e35dfffd7c027b11b5a76ae1f38065 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Tue, 7 Jan 2014 15:01:04 -0800 Subject: [PATCH] CLOUDSTACK-5826: do netmask/gateway validation before calculating the POD cidr --- .../configuration/ConfigurationManagerImpl.java | 13 +++++++++++-- utils/src/com/cloud/utils/net/NetUtils.java | 15 +++++++++++---- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index dd66e16ebb3..4b2ade222c6 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -36,8 +36,6 @@ import javax.ejb.Local; import javax.inject.Inject; import javax.naming.ConfigurationException; -import org.apache.log4j.Logger; - import org.apache.cloudstack.acl.SecurityChecker; import org.apache.cloudstack.affinity.AffinityGroup; import org.apache.cloudstack.affinity.AffinityGroupService; @@ -85,6 +83,7 @@ import org.apache.cloudstack.region.dao.RegionDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; +import org.apache.log4j.Logger; import com.cloud.alert.AlertManager; import com.cloud.api.ApiDBUtils; @@ -1228,6 +1227,16 @@ ConfigurationManagerImpl extends ManagerBase implements ConfigurationManager, Co @Override public Pod createPod(long zoneId, String name, String startIp, String endIp, String gateway, String netmask, String allocationState) { + + // Check if the gateway is a valid IP address + if (!NetUtils.isValidIp(gateway)) { + throw new InvalidParameterValueException("The gateway is invalid"); + } + + if (!NetUtils.isValidNetmask(netmask)) { + throw new InvalidParameterValueException("The netmask is invalid"); + } + String cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask); Long userId = CallContext.current().getCallingUserId(); diff --git a/utils/src/com/cloud/utils/net/NetUtils.java b/utils/src/com/cloud/utils/net/NetUtils.java index 266a5d1d0cf..e6879bf5e7f 100755 --- a/utils/src/com/cloud/utils/net/NetUtils.java +++ b/utils/src/com/cloud/utils/net/NetUtils.java @@ -41,13 +41,12 @@ import org.apache.commons.lang.SystemUtils; import org.apache.commons.net.util.SubnetUtils; import org.apache.log4j.Logger; -import com.googlecode.ipv6.IPv6Address; -import com.googlecode.ipv6.IPv6AddressRange; -import com.googlecode.ipv6.IPv6Network; - import com.cloud.utils.IteratorUtil; import com.cloud.utils.Pair; import com.cloud.utils.script.Script; +import com.googlecode.ipv6.IPv6Address; +import com.googlecode.ipv6.IPv6AddressRange; +import com.googlecode.ipv6.IPv6Network; public class NetUtils { protected final static Logger s_logger = Logger.getLogger(NetUtils.class); @@ -770,6 +769,14 @@ public class NetUtils { } public static String ipAndNetMaskToCidr(String ip, String netmask) { + + if (!isValidIp(ip)) { + return null; + } + + if (!isValidNetmask(netmask)) { + return null; + } long ipAddr = ip2Long(ip); long subnet = ip2Long(netmask); long result = ipAddr & subnet;