NET-641 SubnetUtils.SubnetInfo.isInRange("0.0.0.0") returns true for CIDR/31, 32
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/net/trunk@1804012 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index f1db606..d23b05f 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -74,6 +74,9 @@
The examples are not part of the public API, so this does not affect compatibility.
">
+ <action issue="NET-641" type="fix" dev="sebb" due-to="pin_ptr">
+ SubnetUtils.SubnetInfo.isInRange("0.0.0.0") returns true for CIDR/31, 32
+ </action>
<action issue="NET-638" type="add" dev="sebb" due-to="Daniel Leong">
Telnet subnegotiations hard-limited to 512 bytes - allow override
</action>
diff --git a/src/main/java/org/apache/commons/net/util/SubnetUtils.java b/src/main/java/org/apache/commons/net/util/SubnetUtils.java
index 4de394d..f18f2c6 100644
--- a/src/main/java/org/apache/commons/net/util/SubnetUtils.java
+++ b/src/main/java/org/apache/commons/net/util/SubnetUtils.java
@@ -157,12 +157,17 @@
}
/**
- *
+ * Returns true if the parameter <code>address</code> is in the
+ * range of usable endpoint addresses for this subnet. This excludes the
+ * network and broadcast addresses.
* @param address the address to check
* @return true if it is in range
* @since 3.4 (made public)
*/
public boolean isInRange(int address) {
+ if (address == 0) { // cannot ever be in range; rejecting now avoids problems with CIDR/31,32
+ return false;
+ }
long addLong = address & UNSIGNED_INT_MASK;
long lowLong = low() & UNSIGNED_INT_MASK;
long highLong = high() & UNSIGNED_INT_MASK;
diff --git a/src/test/java/org/apache/commons/net/SubnetUtilsTest.java b/src/test/java/org/apache/commons/net/SubnetUtilsTest.java
index a56e9cd..82ddcde 100644
--- a/src/test/java/org/apache/commons/net/SubnetUtilsTest.java
+++ b/src/test/java/org/apache/commons/net/SubnetUtilsTest.java
@@ -368,4 +368,11 @@
utils.setInclusiveHostCount(false);
assertTrue(info.isInRange("127.0.0.0"));
}
+
+ public void testNET641() {
+ assertFalse(new SubnetUtils("192.168.1.0/00").getInfo().isInRange("0.0.0.0"));
+ assertFalse(new SubnetUtils("192.168.1.0/30").getInfo().isInRange("0.0.0.0"));
+ assertFalse(new SubnetUtils("192.168.1.0/31").getInfo().isInRange("0.0.0.0"));
+ assertFalse(new SubnetUtils("192.168.1.0/32").getInfo().isInRange("0.0.0.0"));
+ }
}