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();
     }