aboutsummaryrefslogtreecommitdiffstats
path: root/poi
diff options
context:
space:
mode:
Diffstat (limited to 'poi')
-rw-r--r--poi/src/main/java/org/apache/poi/ddf/EscherContainerRecord.java5
-rw-r--r--poi/src/main/java/org/apache/poi/ddf/EscherRecord.java25
-rw-r--r--poi/src/main/java/org/apache/poi/ddf/UnknownEscherRecord.java5
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;