You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2022/02/08 07:19:31 UTC

svn commit: r1897842 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageTree.java

Author: lehmi
Date: Tue Feb  8 07:19:31 2022
New Revision: 1897842

URL: http://svn.apache.org/viewvc?rev=1897842&view=rev
Log:
PDFBOX-5339: avoid recursion and a StackOverflowError, throw an IllegalStateException instead

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageTree.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageTree.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageTree.java?rev=1897842&r1=1897841&r2=1897842&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageTree.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageTree.java Tue Feb  8 07:19:31 2022
@@ -46,6 +46,8 @@ public class PDPageTree implements COSOb
     private final COSDictionary root;
     private final PDDocument document; // optional
 
+    private final Set<COSDictionary> pageSet = new HashSet<>();
+
     /**
      * Constructor for embedding.
      */
@@ -278,7 +280,18 @@ public class PDPageTree implements COSOb
         {
             throw new IndexOutOfBoundsException("Index out of bounds: " + pageNum);
         }
-
+        if (pageSet.contains(node))
+        {
+            pageSet.clear();
+            throw new IllegalStateException(
+                    "Possible recursion found when searching for page " + pageNum);
+        }
+        else
+        {
+            // collect already processed pages to detect possible recursions
+            // to avoid a StackOverflowError
+            pageSet.add(node);
+        }
         if (isPageTreeNode(node))
         {
             int count = node.getInt(COSName.COUNT, 0);
@@ -324,6 +337,7 @@ public class PDPageTree implements COSOb
         {
             if (encountered == pageNum)
             {
+                pageSet.clear();
                 return node;
             }
             else