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 2014/04/18 18:26:30 UTC

svn commit: r1588507 - in /lucene/dev/trunk/lucene/core/src/java/org/apache/lucene: codecs/lucene42/Lucene42DocValuesProducer.java codecs/lucene45/Lucene45DocValuesProducer.java index/FieldInfos.java

Author: rmuir
Date: Fri Apr 18 16:26:30 2014
New Revision: 1588507

URL: http://svn.apache.org/r1588507
Log:
LUCENE-5616: remove FieldInfos leniency

Modified:
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/lucene42/Lucene42DocValuesProducer.java
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/lucene45/Lucene45DocValuesProducer.java
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/FieldInfos.java

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/lucene42/Lucene42DocValuesProducer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/lucene42/Lucene42DocValuesProducer.java?rev=1588507&r1=1588506&r2=1588507&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/lucene42/Lucene42DocValuesProducer.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/lucene42/Lucene42DocValuesProducer.java Fri Apr 18 16:26:30 2014
@@ -148,6 +148,13 @@ class Lucene42DocValuesProducer extends 
   private void readFields(IndexInput meta, FieldInfos infos) throws IOException {
     int fieldNumber = meta.readVInt();
     while (fieldNumber != -1) {
+      // check should be: infos.fieldInfo(fieldNumber) != null, which incorporates negative check
+      // but docvalues updates are currently buggy here (loading extra stuff, etc): LUCENE-5616
+      if (fieldNumber < 0) {
+        // trickier to validate more: because we re-use for norms, because we use multiple entries
+        // for "composite" types like sortedset, etc.
+        throw new CorruptIndexException("Invalid field number: " + fieldNumber + ", input=" + meta);
+      }
       int fieldType = meta.readByte();
       if (fieldType == NUMBER) {
         NumericEntry entry = new NumericEntry();

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/lucene45/Lucene45DocValuesProducer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/lucene45/Lucene45DocValuesProducer.java?rev=1588507&r1=1588506&r2=1588507&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/lucene45/Lucene45DocValuesProducer.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/codecs/lucene45/Lucene45DocValuesProducer.java Fri Apr 18 16:26:30 2014
@@ -185,6 +185,13 @@ public class Lucene45DocValuesProducer e
   private void readFields(IndexInput meta, FieldInfos infos) throws IOException {
     int fieldNumber = meta.readVInt();
     while (fieldNumber != -1) {
+      // check should be: infos.fieldInfo(fieldNumber) != null, which incorporates negative check
+      // but docvalues updates are currently buggy here (loading extra stuff, etc): LUCENE-5616
+      if (fieldNumber < 0) {
+        // trickier to validate more: because we re-use for norms, because we use multiple entries
+        // for "composite" types like sortedset, etc.
+        throw new CorruptIndexException("Invalid field number: " + fieldNumber + " (resource=" + meta + ")");
+      }
       byte type = meta.readByte();
       if (type == Lucene45DocValuesFormat.NUMERIC) {
         numerics.put(fieldNumber, readNumericEntry(meta));

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/FieldInfos.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/FieldInfos.java?rev=1588507&r1=1588506&r2=1588507&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/FieldInfos.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/FieldInfos.java Fri Apr 18 16:26:30 2014
@@ -58,6 +58,9 @@ public class FieldInfos implements Itera
     boolean hasDocValues = false;
     
     for (FieldInfo info : infos) {
+      if (info.number < 0) {
+        throw new IllegalArgumentException("illegal field number: " + info.number + " for field " + info.name);
+      }
       FieldInfo previous = byNumber.put(info.number, info);
       if (previous != null) {
         throw new IllegalArgumentException("duplicate field numbers: " + previous.name + " and " + info.name + " have: " + info.number);
@@ -148,15 +151,16 @@ public class FieldInfos implements Itera
 
   /**
    * Return the fieldinfo object referenced by the fieldNumber.
-   * @param fieldNumber field's number. if this is negative, this method
-   *        always returns null.
+   * @param fieldNumber field's number.
    * @return the FieldInfo object or null when the given fieldNumber
    * doesn't exist.
-   */  
-  // TODO: fix this negative behavior, this was something related to Lucene3x?
-  // if the field name is empty, i think it writes the fieldNumber as -1
+   * @throws IllegalArgumentException if fieldNumber is negative
+   */
   public FieldInfo fieldInfo(int fieldNumber) {
-    return (fieldNumber >= 0) ? byNumber.get(fieldNumber) : null;
+    if (fieldNumber < 0) {
+      throw new IllegalArgumentException("Illegal field number: " + fieldNumber);
+    }
+    return byNumber.get(fieldNumber);
   }
   
   static final class FieldNumbers {