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.