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.