Author: tilman
Date: Wed Jul 23 09:40:52 2025
New Revision: 1927424

Log:
PDFBOX-6040: prevent loop + test file, as suggested by David Justamante; add 
test

Added:
   
pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/PDFBOX-6040-nodeloop.pdf
   (contents, props changed)
Modified:
   
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageTree.java
   
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/TestPDPageTree.java

Modified: 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageTree.java
==============================================================================
--- 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageTree.java
  Wed Jul 23 09:40:39 2025        (r1927423)
+++ 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageTree.java
  Wed Jul 23 09:40:52 2025        (r1927424)
@@ -107,6 +107,17 @@ public class PDPageTree implements COSOb
      */
     public static COSBase getInheritableAttribute(COSDictionary node, COSName 
key)
     {
+        return getInheritableAttribute(node, key, new 
HashSet<COSDictionary>());
+    }
+
+    private static COSBase getInheritableAttribute(COSDictionary node, COSName 
key, Set<COSDictionary> visited)
+    {
+        if (visited.contains(node))
+        {
+            return null;
+        }
+        visited.add(node);
+
         COSBase value = node.getDictionaryObject(key);
         if (value != null)
         {
@@ -119,7 +130,7 @@ public class PDPageTree implements COSOb
             COSDictionary parent = (COSDictionary) base;
             if (COSName.PAGES.equals(parent.getDictionaryObject(COSName.TYPE)))
             {
-                return getInheritableAttribute(parent, key);
+                return getInheritableAttribute(parent, key, visited);
             }
         }
 

Modified: 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/TestPDPageTree.java
==============================================================================
--- 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/TestPDPageTree.java
      Wed Jul 23 09:40:39 2025        (r1927423)
+++ 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/TestPDPageTree.java
      Wed Jul 23 09:40:52 2025        (r1927424)
@@ -17,6 +17,7 @@
 package org.apache.pdfbox.pdmodel;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 
 import java.io.IOException;
 
@@ -83,4 +84,16 @@ public class TestPDPageTree
         doc = 
PDDocument.load(TestPDPageTree.class.getResourceAsStream("with_outline.pdf"));
         assertEquals(-1, doc.getPages().indexOf(new PDPage()));
     }
+
+    /**
+     * PDFBOX-6040: avoid loop in getInheritableAttribute().
+     *
+     * @throws IOException 
+     */
+    @Test
+    public void testNodeLoop() throws IOException
+    {
+        doc = 
PDDocument.load(TestPDPageTree.class.getResourceAsStream("PDFBOX-6040-nodeloop.pdf"));
+        assertNull(doc.getPage(0).getResources());
+    }
 }

Added: 
pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/PDFBOX-6040-nodeloop.pdf
==============================================================================
Binary file. No diff available.

Reply via email to