You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2012/03/16 13:37:58 UTC

svn commit: r1301466 - in /lucene/dev/trunk/lucene: CHANGES.txt core/src/java/org/apache/lucene/index/FreqProxTermsWriterPerField.java core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java

Author: rmuir
Date: Fri Mar 16 12:37:58 2012
New Revision: 1301466

URL: http://svn.apache.org/viewvc?rev=1301466&view=rev
Log:
LUCENE-3876: don't corrupt the index (from wrong shift operator) for large documents

Modified:
    lucene/dev/trunk/lucene/CHANGES.txt
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/FreqProxTermsWriterPerField.java
    lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java

Modified: lucene/dev/trunk/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/CHANGES.txt?rev=1301466&r1=1301465&r2=1301466&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/CHANGES.txt Fri Mar 16 12:37:58 2012
@@ -943,6 +943,10 @@ Bug fixes
   integer overflow. This can happen, for example when using a buggy
   TokenStream that forgets to call clearAttributes() in combination
   with a StopFilter. (Robert Muir)
+
+* LUCENE-3876: Fix bug where positions for a document exceeding
+  Integer.MAX_VALUE/2 would produce a corrupt index.  
+  (Simon Willnauer, Mike Mccandless, Robert Muir)
     
 Optimizations
 

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/FreqProxTermsWriterPerField.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/FreqProxTermsWriterPerField.java?rev=1301466&r1=1301465&r2=1301466&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/FreqProxTermsWriterPerField.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/FreqProxTermsWriterPerField.java Fri Mar 16 12:37:58 2012
@@ -486,7 +486,7 @@ final class FreqProxTermsWriterPerField 
 
             if (readPositions) {
               final int code = prox.readVInt();
-              position += code >> 1;
+              position += code >>> 1;
 
               if ((code & 1) != 0) {
 

Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java?rev=1301466&r1=1301465&r2=1301466&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java Fri Mar 16 12:37:58 2012
@@ -1517,4 +1517,20 @@ public class TestIndexWriterExceptions e
     iw.close();
     dir.close();
   }
+  
+  public void testLegalbutVeryLargePositions() throws Exception {
+    Directory dir = newDirectory();
+    IndexWriter iw = new IndexWriter(dir, newIndexWriterConfig(TEST_VERSION_CURRENT, null));
+    Document doc = new Document();
+    Token t1 = new Token("foo", 0, 3);
+    t1.setPositionIncrement(Integer.MAX_VALUE-500);
+    TokenStream overflowingTokenStream = new CannedTokenStream(
+        new Token[] { t1 }
+    );
+    Field field = new TextField("foo", overflowingTokenStream);
+    doc.add(field);
+    iw.addDocument(doc);
+    iw.close();
+    dir.close();
+  }
 }