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.