You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2020/12/12 16:56:08 UTC
svn commit: r1884357 -
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java
Author: tilman
Date: Sat Dec 12 16:56:08 2020
New Revision: 1884357
URL: http://svn.apache.org/viewvc?rev=1884357&view=rev
Log:
PDFBOX-5044: avoid stack overflow
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java?rev=1884357&r1=1884356&r2=1884357&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java Sat Dec 12 16:56:08 2020
@@ -17,17 +17,24 @@
package org.apache.pdfbox.pdmodel.interactive.form;
import java.util.ArrayDeque;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.Queue;
import java.util.List;
import java.util.NoSuchElementException;
+import java.util.Set;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.pdfbox.cos.COSDictionary;
/**
* The field tree.
*/
public class PDFieldTree implements Iterable<PDField>
{
+ private static final Log LOG = LogFactory.getLog(PDFieldTree.class);
+
private final PDAcroForm acroForm;
/**
@@ -60,6 +67,10 @@ public class PDFieldTree implements Iter
{
private final Queue<PDField> queue = new ArrayDeque<>();
+ // PDFBOX-5044: to prevent recursion
+ // must be COSDictionary and not PDField, because PDField is newly created each time
+ private final Set<COSDictionary> set = new HashSet<>();
+
private FieldIterator(PDAcroForm form)
{
List<PDField> fields = form.getFields();
@@ -78,7 +89,8 @@ public class PDFieldTree implements Iter
@Override
public PDField next()
{
- if(!hasNext()){
+ if(!hasNext())
+ {
throw new NoSuchElementException();
}
@@ -94,12 +106,21 @@ public class PDFieldTree implements Iter
private void enqueueKids(PDField node)
{
queue.add(node);
+ set.add(node.getCOSObject());
if (node instanceof PDNonTerminalField)
{
List<PDField> kids = ((PDNonTerminalField) node).getChildren();
for (PDField kid : kids)
{
- enqueueKids(kid);
+ if (set.contains(kid.getCOSObject()))
+ {
+ LOG.error("Child of field '" + node.getFullyQualifiedName() +
+ "' already exists elsewhere, ignored to avoid recursion");
+ }
+ else
+ {
+ enqueueKids(kid);
+ }
}
}
}