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);
+                    }
                 }
             }
         }