You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2012/07/17 23:33:36 UTC

svn commit: r1362667 - in /lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/fst: FST.java NodeHash.java

Author: mikemccand
Date: Tue Jul 17 21:33:36 2012
New Revision: 1362667

URL: http://svn.apache.org/viewvc?rev=1362667&view=rev
Log:
add/improve FST asserts to detect > 2.1 GB FST

Modified:
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/fst/FST.java
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/fst/NodeHash.java

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/fst/FST.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/fst/FST.java?rev=1362667&r1=1362666&r2=1362667&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/fst/FST.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/fst/FST.java Tue Jul 17 21:33:36 2012
@@ -669,6 +669,8 @@ public final class FST<T> {
       // 2nd pass just "expands" all arcs to take up a fixed
       // byte size
       final int sizeNeeded = fixedArrayStart + nodeIn.numArcs * maxBytesPerArc;
+      assert ((long) fixedArrayStart) + ((long) nodeIn.numArcs) * maxBytesPerArc < Integer.MAX_VALUE: "FST too large (> 2.1 GB)";
+
       bytes = ArrayUtil.grow(bytes, sizeNeeded);
       // TODO: we could make this a vInt instead
       bytes[fixedArrayStart-4] = (byte) (maxBytesPerArc >> 24);
@@ -685,7 +687,7 @@ public final class FST<T> {
         destPos -= maxBytesPerArc;
         srcPos -= bytesPerArc[arcIdx];
         if (srcPos != destPos) {
-          assert destPos > srcPos;
+          assert destPos > srcPos: "destPos=" + destPos + " srcPos=" + srcPos + " arcIdx=" + arcIdx + " maxBytesPerArc=" + maxBytesPerArc + " bytesPerArc[arcIdx]=" + bytesPerArc[arcIdx] + " nodeIn.numArcs=" + nodeIn.numArcs;
           System.arraycopy(bytes, srcPos, bytes, destPos, bytesPerArc[arcIdx]);
         }
       }
@@ -1194,6 +1196,7 @@ public final class FST<T> {
     public void writeByte(byte b) {
       assert posWrite <= bytes.length;
       if (bytes.length == posWrite) {
+        assert bytes.length < Integer.MAX_VALUE: "FST too large (> 2.1 GB)";
         bytes = ArrayUtil.grow(bytes);
       }
       assert posWrite < bytes.length: "posWrite=" + posWrite + " bytes.length=" + bytes.length;
@@ -1203,6 +1206,7 @@ public final class FST<T> {
     public void setPosWrite(int posWrite) {
       this.posWrite = posWrite;
       if (bytes.length < posWrite) {
+        assert bytes.length < Integer.MAX_VALUE: "FST too large (> 2.1 GB)";
         bytes = ArrayUtil.grow(bytes, posWrite);
       }
     }
@@ -1210,6 +1214,7 @@ public final class FST<T> {
     @Override
     public void writeBytes(byte[] b, int offset, int length) {
       final int size = posWrite + length;
+      assert bytes.length < Integer.MAX_VALUE: "FST too large (> 2.1 GB)";
       bytes = ArrayUtil.grow(bytes, size);
       System.arraycopy(b, offset, bytes, posWrite, length);
       posWrite += length;

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/fst/NodeHash.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/fst/NodeHash.java?rev=1362667&r1=1362666&r2=1362667&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/fst/NodeHash.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/fst/NodeHash.java Tue Jul 17 21:33:36 2012
@@ -155,6 +155,11 @@ final class NodeHash<T> {
 
   private void rehash() throws IOException {
     final int[] oldTable = table;
+
+    if (oldTable.length >= Integer.MAX_VALUE/2) {
+      throw new IllegalStateException("FST too large (> 2.1 GB)");
+    }
+
     table = new int[2*table.length];
     mask = table.length-1;
     for(int idx=0;idx<oldTable.length;idx++) {