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.