Author: tilman
Date: Wed Jul 23 09:40:34 2025
New Revision: 1927422

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

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

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageTree.java
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageTree.java 
Wed Jul 23 08:30:20 2025        (r1927421)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageTree.java 
Wed Jul 23 09:40:34 2025        (r1927422)
@@ -107,6 +107,17 @@ public class PDPageTree implements COSOb
      */
     public static COSBase getInheritableAttribute(COSDictionary node, COSName 
key)
     {
+        return getInheritableAttribute(node, key, new HashSet<>());
+    }
+
+    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)
         {
@@ -115,7 +126,7 @@ public class PDPageTree implements COSOb
         COSDictionary parent = node.getCOSDictionary(COSName.PARENT, 
COSName.P);
         if (parent != null && 
COSName.PAGES.equals(parent.getCOSName(COSName.TYPE)))
         {
-            return getInheritableAttribute(parent, key);
+            return getInheritableAttribute(parent, key, visited);
         }
 
         return null;

Modified: 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/TestPDPageTree.java
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/TestPDPageTree.java 
    Wed Jul 23 08:30:20 2025        (r1927421)
+++ 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/TestPDPageTree.java 
    Wed Jul 23 09:40:34 2025        (r1927422)
@@ -17,6 +17,7 @@
 package org.apache.pdfbox.pdmodel;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
 import java.io.IOException;
 
@@ -131,4 +132,17 @@ class TestPDPageTree
                     "Page three should be placed at index 2.");
         }
     }
+
+    /**
+     * PDFBOX-6040: avoid loop in getInheritableAttribute().
+     *
+     * @throws IOException 
+     */
+    @Test
+    void testNodeLoop() throws IOException
+    {
+        doc = Loader.loadPDF(RandomAccessReadBuffer.createBufferFromStream(
+                
TestPDPageTree.class.getResourceAsStream("PDFBOX-6040-nodeloop.pdf")));
+        assertNull(doc.getPage(0).getResources());
+    }
 }

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

Reply via email to