You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by cp...@apache.org on 2017/04/07 15:47:43 UTC
[06/24] lucene-solr:jira/solr-6203: LUCENE-7738: Fix min/max
verification bug in InetAddressRange to correctly compare IPv4 and IPv6.
Update tests.
LUCENE-7738: Fix min/max verification bug in InetAddressRange to correctly compare IPv4 and IPv6. Update tests.
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/ef8126e5
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/ef8126e5
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/ef8126e5
Branch: refs/heads/jira/solr-6203
Commit: ef8126e5eab7aec9c8775c2e08bd6c2bb1ef690f
Parents: cb9f151
Author: Nicholas Knize <nk...@gmail.com>
Authored: Wed Apr 5 11:10:15 2017 -0500
Committer: Nicholas Knize <nk...@gmail.com>
Committed: Wed Apr 5 11:10:15 2017 -0500
----------------------------------------------------------------------
.../lucene/document/InetAddressRange.java | 14 ++-
.../search/TestInetAddressRangeQueries.java | 100 ++++++++-----------
2 files changed, 50 insertions(+), 64 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ef8126e5/lucene/misc/src/java/org/apache/lucene/document/InetAddressRange.java
----------------------------------------------------------------------
diff --git a/lucene/misc/src/java/org/apache/lucene/document/InetAddressRange.java b/lucene/misc/src/java/org/apache/lucene/document/InetAddressRange.java
index 5fa1fb9..84f0d6b 100644
--- a/lucene/misc/src/java/org/apache/lucene/document/InetAddressRange.java
+++ b/lucene/misc/src/java/org/apache/lucene/document/InetAddressRange.java
@@ -68,9 +68,6 @@ public class InetAddressRange extends Field {
* @param max range max value; defined as an {@code InetAddress}
*/
public void setRangeValues(InetAddress min, InetAddress max) {
- if (StringHelper.compare(BYTES, min.getAddress(), 0, max.getAddress(), 0) > 0) {
- throw new IllegalArgumentException("min value cannot be greater than max value for range field (name=" + name + ")");
- }
final byte[] bytes;
if (fieldsData == null) {
bytes = new byte[BYTES*2];
@@ -83,8 +80,15 @@ public class InetAddressRange extends Field {
/** encode the min/max range into the provided byte array */
private static void encode(final InetAddress min, final InetAddress max, final byte[] bytes) {
- System.arraycopy(InetAddressPoint.encode(min), 0, bytes, 0, BYTES);
- System.arraycopy(InetAddressPoint.encode(max), 0, bytes, BYTES, BYTES);
+ // encode min and max value (consistent w/ InetAddressPoint encoding)
+ final byte[] minEncoded = InetAddressPoint.encode(min);
+ final byte[] maxEncoded = InetAddressPoint.encode(max);
+ // ensure min is lt max
+ if (StringHelper.compare(BYTES, minEncoded, 0, maxEncoded, 0) > 0) {
+ throw new IllegalArgumentException("min value cannot be greater than max value for InetAddressRange field");
+ }
+ System.arraycopy(minEncoded, 0, bytes, 0, BYTES);
+ System.arraycopy(maxEncoded, 0, bytes, BYTES, BYTES);
}
/** encode the min/max range and return the byte array */
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ef8126e5/lucene/misc/src/test/org/apache/lucene/search/TestInetAddressRangeQueries.java
----------------------------------------------------------------------
diff --git a/lucene/misc/src/test/org/apache/lucene/search/TestInetAddressRangeQueries.java b/lucene/misc/src/test/org/apache/lucene/search/TestInetAddressRangeQueries.java
index e22cf9b..252162c 100644
--- a/lucene/misc/src/test/org/apache/lucene/search/TestInetAddressRangeQueries.java
+++ b/lucene/misc/src/test/org/apache/lucene/search/TestInetAddressRangeQueries.java
@@ -19,6 +19,7 @@ package org.apache.lucene.search;
import java.net.InetAddress;
import java.net.UnknownHostException;
+import org.apache.lucene.document.InetAddressPoint;
import org.apache.lucene.document.InetAddressRange;
import org.apache.lucene.util.StringHelper;
@@ -28,16 +29,12 @@ import org.apache.lucene.util.StringHelper;
public class TestInetAddressRangeQueries extends BaseRangeFieldQueryTestCase {
private static final String FIELD_NAME = "ipRangeField";
- private IPVersion ipVersion;
-
- private enum IPVersion {IPv4, IPv6}
-
@Override
protected Range nextRange(int dimensions) throws Exception {
InetAddress min = nextInetaddress();
- byte[] bMin = min.getAddress();
+ byte[] bMin = InetAddressPoint.encode(min);
InetAddress max = nextInetaddress();
- byte[] bMax = max.getAddress();
+ byte[] bMax = InetAddressPoint.encode(max);
if (StringHelper.compare(bMin.length, bMin, 0, bMax, 0) > 0) {
return new IpRange(max, min);
}
@@ -46,89 +43,74 @@ public class TestInetAddressRangeQueries extends BaseRangeFieldQueryTestCase {
/** return random IPv4 or IPv6 address */
private InetAddress nextInetaddress() throws UnknownHostException {
- byte[] b;
- switch (ipVersion) {
- case IPv4:
- b = new byte[4];
- break;
- case IPv6:
- b = new byte[16];
- break;
- default:
- throw new IllegalArgumentException("incorrect IP version: " + ipVersion);
- }
+ byte[] b = random().nextBoolean() ? new byte[4] : new byte[16];
random().nextBytes(b);
return InetAddress.getByAddress(b);
}
- /** randomly select version across tests */
- private IPVersion ipVersion() {
- return random().nextBoolean() ? IPVersion.IPv4 : IPVersion.IPv6;
- }
-
@Override
public void testRandomTiny() throws Exception {
- ipVersion = ipVersion();
super.testRandomTiny();
}
@Override
public void testMultiValued() throws Exception {
- ipVersion = ipVersion();
super.testRandomMedium();
}
@Override
public void testRandomMedium() throws Exception {
- ipVersion = ipVersion();
super.testMultiValued();
}
@Nightly
@Override
public void testRandomBig() throws Exception {
- ipVersion = ipVersion();
super.testRandomBig();
}
/** return random range */
@Override
protected InetAddressRange newRangeField(Range r) {
- return new InetAddressRange(FIELD_NAME, ((IpRange)r).min, ((IpRange)r).max);
+ return new InetAddressRange(FIELD_NAME, ((IpRange)r).minAddress, ((IpRange)r).maxAddress);
}
/** return random intersects query */
@Override
protected Query newIntersectsQuery(Range r) {
- return InetAddressRange.newIntersectsQuery(FIELD_NAME, ((IpRange)r).min, ((IpRange)r).max);
+ return InetAddressRange.newIntersectsQuery(FIELD_NAME, ((IpRange)r).minAddress, ((IpRange)r).maxAddress);
}
/** return random contains query */
@Override
protected Query newContainsQuery(Range r) {
- return InetAddressRange.newContainsQuery(FIELD_NAME, ((IpRange)r).min, ((IpRange)r).max);
+ return InetAddressRange.newContainsQuery(FIELD_NAME, ((IpRange)r).minAddress, ((IpRange)r).maxAddress);
}
/** return random within query */
@Override
protected Query newWithinQuery(Range r) {
- return InetAddressRange.newWithinQuery(FIELD_NAME, ((IpRange)r).min, ((IpRange)r).max);
+ return InetAddressRange.newWithinQuery(FIELD_NAME, ((IpRange)r).minAddress, ((IpRange)r).maxAddress);
}
/** return random crosses query */
@Override
protected Query newCrossesQuery(Range r) {
- return InetAddressRange.newCrossesQuery(FIELD_NAME, ((IpRange)r).min, ((IpRange)r).max);
+ return InetAddressRange.newCrossesQuery(FIELD_NAME, ((IpRange)r).minAddress, ((IpRange)r).maxAddress);
}
/** encapsulated IpRange for test validation */
private class IpRange extends Range {
- InetAddress min;
- InetAddress max;
+ InetAddress minAddress;
+ InetAddress maxAddress;
+ byte[] min;
+ byte[] max;
IpRange(InetAddress min, InetAddress max) {
- this.min = min;
- this.max = max;
+ this.minAddress = min;
+ this.maxAddress = max;
+ this.min = InetAddressPoint.encode(min);
+ this.max = InetAddressPoint.encode(max);
}
@Override
@@ -138,33 +120,39 @@ public class TestInetAddressRangeQueries extends BaseRangeFieldQueryTestCase {
@Override
protected InetAddress getMin(int dim) {
- return min;
+ return minAddress;
}
@Override
protected void setMin(int dim, Object val) {
- byte[] v = ((InetAddress)val).getAddress();
+ InetAddress v = (InetAddress)val;
+ byte[] e = InetAddressPoint.encode(v);
- if (StringHelper.compare(v.length, min.getAddress(), 0, v, 0) < 0) {
- max = (InetAddress)val;
+ if (StringHelper.compare(e.length, min, 0, e, 0) < 0) {
+ max = e;
+ maxAddress = v;
} else {
- min = (InetAddress) val;
+ min = e;
+ minAddress = v;
}
}
@Override
protected InetAddress getMax(int dim) {
- return max;
+ return maxAddress;
}
@Override
protected void setMax(int dim, Object val) {
- byte[] v = ((InetAddress)val).getAddress();
+ InetAddress v = (InetAddress)val;
+ byte[] e = InetAddressPoint.encode(v);
- if (StringHelper.compare(v.length, max.getAddress(), 0, v, 0) > 0) {
- min = (InetAddress)val;
+ if (StringHelper.compare(e.length, max, 0, e, 0) > 0) {
+ min = e;
+ minAddress = v;
} else {
- max = (InetAddress) val;
+ max = e;
+ maxAddress = v;
}
}
@@ -177,37 +165,31 @@ public class TestInetAddressRangeQueries extends BaseRangeFieldQueryTestCase {
@Override
protected boolean isDisjoint(Range o) {
IpRange other = (IpRange)o;
- byte[] bMin = min.getAddress();
- byte[] bMax = max.getAddress();
- return StringHelper.compare(bMin.length, bMin, 0, other.max.getAddress(), 0) > 0 ||
- StringHelper.compare(bMax.length, bMax, 0, other.min.getAddress(), 0) < 0;
+ return StringHelper.compare(min.length, min, 0, other.max, 0) > 0 ||
+ StringHelper.compare(max.length, max, 0, other.min, 0) < 0;
}
@Override
protected boolean isWithin(Range o) {
IpRange other = (IpRange)o;
- byte[] bMin = min.getAddress();
- byte[] bMax = max.getAddress();
- return StringHelper.compare(bMin.length, bMin, 0, other.min.getAddress(), 0) >= 0 &&
- StringHelper.compare(bMax.length, bMax, 0, other.max.getAddress(), 0) <= 0;
+ return StringHelper.compare(min.length, min, 0, other.min, 0) >= 0 &&
+ StringHelper.compare(max.length, max, 0, other.max, 0) <= 0;
}
@Override
protected boolean contains(Range o) {
IpRange other = (IpRange)o;
- byte[] bMin = min.getAddress();
- byte[] bMax = max.getAddress();
- return StringHelper.compare(bMin.length, bMin, 0, other.min.getAddress(), 0) <= 0 &&
- StringHelper.compare(bMax.length, bMax, 0, other.max.getAddress(), 0) >= 0;
+ return StringHelper.compare(min.length, min, 0, other.min, 0) <= 0 &&
+ StringHelper.compare(max.length, max, 0, other.max, 0) >= 0;
}
@Override
public String toString() {
StringBuilder b = new StringBuilder();
b.append("Box(");
- b.append(min.getHostAddress());
+ b.append(minAddress.getHostAddress());
b.append(" TO ");
- b.append(max.getHostAddress());
+ b.append(maxAddress.getHostAddress());
b.append(")");
return b.toString();
}