Author: frm
Date: Fri Sep  9 12:03:26 2016
New Revision: 1759996

URL: http://svn.apache.org/viewvc?rev=1759996&view=rev
Log:
OAK-4738 - IPv6 addresses don't fit in 64 bits

Modified:
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilter.java

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilter.java?rev=1759996&r1=1759995&r2=1759996&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilter.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/IpAddressFilter.java
 Fri Sep  9 12:03:26 2016
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.segmen
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.util.Arrays;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -34,16 +35,45 @@ class IpAddressFilter {
 
     private static final Logger log = 
LoggerFactory.getLogger(IpAddressFilter.class);
 
-    private static long ipToLong(InetAddress ip) {
-        byte[] octets = ip.getAddress();
+    private static boolean areAddressesEqual(InetAddress a, InetAddress b) {
+        return Arrays.equals(a.getAddress(), b.getAddress());
+    }
+
+    private static int compare(byte[] left, byte[] right) {
+        assert left.length == right.length;
+
+        for (int i = 0; i < left.length; i++) {
+            int l = left[i] & 0xff;
+            int r = right[i] & 0xff;
+
+            if (l < r) {
+                return -1;
+            }
+
+            if (r < l) {
+                return 1;
+            }
+        }
+
+        return 0;
+    }
+
+    private static boolean isAddressInRange(InetAddress address, InetAddress 
left, InetAddress right) {
+        byte[] addressBytes = address.getAddress();
 
-        long result = 0;
+        byte[] leftBytes = left.getAddress();
 
-        for (byte octet : octets) {
-            result = (result << 8) | (octet & 0xff);
+        if (leftBytes.length != addressBytes.length) {
+            return false;
         }
 
-        return result;
+        byte[] rightBytes = right.getAddress();
+
+        if (rightBytes.length != addressBytes.length) {
+            return false;
+        }
+
+        return compare(leftBytes, addressBytes) <= 0 && compare(addressBytes, 
rightBytes) <= 0;
     }
 
     private static boolean isAllowed(InetAddress client, String left, String 
right) {
@@ -65,7 +95,7 @@ class IpAddressFilter {
             return false;
         }
 
-        return isAllowed(ipToLong(client), ipToLong(leftAddress), 
ipToLong(rightAddress));
+        return isAddressInRange(client, leftAddress, rightAddress);
     }
 
     private static boolean isAllowed(InetAddress client, String match) {
@@ -78,11 +108,7 @@ class IpAddressFilter {
             return false;
         }
 
-        return ipToLong(client) == ipToLong(matchAddress);
-    }
-
-    private static boolean isAllowed(long address, long left, long right) {
-        return left <= address && address <= right;
+        return areAddressesEqual(matchAddress, client);
     }
 
     private final String[] allowedIpRanges;


Reply via email to