LUCENE-5616: remove FieldInfos leniency

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1588507 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Robert Muir 2014-04-18 16:26:30 +00:00
parent b9a22bb5db
commit 8e3727bb05
3 changed files with 24 additions and 6 deletions

View File

@ -148,6 +148,13 @@ class Lucene42DocValuesProducer extends DocValuesProducer {
private void readFields(IndexInput meta, FieldInfos infos) throws IOException { private void readFields(IndexInput meta, FieldInfos infos) throws IOException {
int fieldNumber = meta.readVInt(); int fieldNumber = meta.readVInt();
while (fieldNumber != -1) { 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(); int fieldType = meta.readByte();
if (fieldType == NUMBER) { if (fieldType == NUMBER) {
NumericEntry entry = new NumericEntry(); NumericEntry entry = new NumericEntry();

View File

@ -185,6 +185,13 @@ public class Lucene45DocValuesProducer extends DocValuesProducer implements Clos
private void readFields(IndexInput meta, FieldInfos infos) throws IOException { private void readFields(IndexInput meta, FieldInfos infos) throws IOException {
int fieldNumber = meta.readVInt(); int fieldNumber = meta.readVInt();
while (fieldNumber != -1) { 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(); byte type = meta.readByte();
if (type == Lucene45DocValuesFormat.NUMERIC) { if (type == Lucene45DocValuesFormat.NUMERIC) {
numerics.put(fieldNumber, readNumericEntry(meta)); numerics.put(fieldNumber, readNumericEntry(meta));

View File

@ -58,6 +58,9 @@ public class FieldInfos implements Iterable<FieldInfo> {
boolean hasDocValues = false; boolean hasDocValues = false;
for (FieldInfo info : infos) { 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); FieldInfo previous = byNumber.put(info.number, info);
if (previous != null) { if (previous != null) {
throw new IllegalArgumentException("duplicate field numbers: " + previous.name + " and " + info.name + " have: " + info.number); throw new IllegalArgumentException("duplicate field numbers: " + previous.name + " and " + info.name + " have: " + info.number);
@ -148,15 +151,16 @@ public class FieldInfos implements Iterable<FieldInfo> {
/** /**
* Return the fieldinfo object referenced by the fieldNumber. * Return the fieldinfo object referenced by the fieldNumber.
* @param fieldNumber field's number. if this is negative, this method * @param fieldNumber field's number.
* always returns null.
* @return the FieldInfo object or null when the given fieldNumber * @return the FieldInfo object or null when the given fieldNumber
* doesn't exist. * doesn't exist.
* @throws IllegalArgumentException if fieldNumber is negative
*/ */
// 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
public FieldInfo fieldInfo(int fieldNumber) { 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 { static final class FieldNumbers {