diff options
Diffstat (limited to 'poi')
3 files changed, 31 insertions, 4 deletions
diff --git a/poi/src/main/java/org/apache/poi/ddf/EscherContainerRecord.java b/poi/src/main/java/org/apache/poi/ddf/EscherContainerRecord.java index ab30e2c404..747dbde1a5 100644 --- a/poi/src/main/java/org/apache/poi/ddf/EscherContainerRecord.java +++ b/poi/src/main/java/org/apache/poi/ddf/EscherContainerRecord.java @@ -91,7 +91,8 @@ public final class EscherContainerRecord extends EscherRecord implements Iterabl return fillFields(data, pOffset, recordFactory, 0); } - int fillFields(byte[] data, int pOffset, EscherRecordFactory recordFactory, int nesting) { + @Override + protected int fillFields(byte[] data, int pOffset, EscherRecordFactory recordFactory, int nesting) { if (nesting > MAX_NESTED_CHILD_NODES) { throw new IllegalStateException("Had more than the limit of " + MAX_NESTED_CHILD_NODES + " nested child notes"); } @@ -107,7 +108,7 @@ public final class EscherContainerRecord extends EscherRecord implements Iterabl } else if (child instanceof UnknownEscherRecord) { childBytesWritten = ((UnknownEscherRecord)child).fillFields(data, offset, recordFactory, nesting + 1); } else { - childBytesWritten = child.fillFields(data, offset, recordFactory); + childBytesWritten = child.fillFields(data, offset, recordFactory, nesting + 1); } bytesWritten += childBytesWritten; diff --git a/poi/src/main/java/org/apache/poi/ddf/EscherRecord.java b/poi/src/main/java/org/apache/poi/ddf/EscherRecord.java index c817e7d060..3d9aeacca8 100644 --- a/poi/src/main/java/org/apache/poi/ddf/EscherRecord.java +++ b/poi/src/main/java/org/apache/poi/ddf/EscherRecord.java @@ -84,6 +84,31 @@ public abstract class EscherRecord implements Duplicatable, GenericRecord { public abstract int fillFields( byte[] data, int offset, EscherRecordFactory recordFactory ); /** + * Internal method to prevent too deep nesting/using too much memory. + * + * This is done by counting the level of "nesting" via the parameter. + * + * The default method just forwards to fillFields() so it does not properly + * handle nesting. Subclasses which do recursive calls need to pass + * around the nesting-level properly. + * + * Usually both fillFields() methods should be overwritten by subclasses, + * the one without the "nesting"-parameter should routes to this one in + * classes which overwrite this method and this method should be overwritten + * with the actual functionality to fill fields. + * + * @param data The byte array containing the serialized escher + * records. + * @param offset The offset into the byte array. + * @param recordFactory A factory for creating new escher records. + * @param nesting The current nesting factor, usually increased by one on each recursive call + * @return The number of bytes written. + */ + protected int fillFields(byte[] data, int offset, EscherRecordFactory recordFactory, int nesting) { + return fillFields(data, offset, recordFactory); + } + + /** * Reads the 8 byte header information and populates the <code>options</code> * and <code>recordId</code> records. * diff --git a/poi/src/main/java/org/apache/poi/ddf/UnknownEscherRecord.java b/poi/src/main/java/org/apache/poi/ddf/UnknownEscherRecord.java index 475cfdecae..a81286c5c7 100644 --- a/poi/src/main/java/org/apache/poi/ddf/UnknownEscherRecord.java +++ b/poi/src/main/java/org/apache/poi/ddf/UnknownEscherRecord.java @@ -70,7 +70,8 @@ public final class UnknownEscherRecord extends EscherRecord { return fillFields(data, offset, recordFactory, 0); } - int fillFields(byte[] data, int offset, EscherRecordFactory recordFactory, int nesting) { + @Override + protected int fillFields(byte[] data, int offset, EscherRecordFactory recordFactory, int nesting) { if (nesting > MAX_NESTED_CHILD_NODES) { throw new IllegalStateException("Had more than the limit of " + MAX_NESTED_CHILD_NODES + " nested child notes"); } @@ -97,7 +98,7 @@ public final class UnknownEscherRecord extends EscherRecord { if (child instanceof EscherContainerRecord) { childBytesWritten = ((EscherContainerRecord)child).fillFields(data, offset, recordFactory, nesting + 1); } else { - childBytesWritten = child.fillFields(data, offset, recordFactory); + childBytesWritten = child.fillFields(data, offset, recordFactory, nesting + 1); } bytesWritten += childBytesWritten; offset += childBytesWritten; |