Author: tilman
Date: Thu Jul 30 09:03:22 2026
New Revision: 1936724
Log:
PDFBOX-6228: catch cycle
Modified:
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/documentinterchange/logicalstructure/PDStructureElement.java
Modified:
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/documentinterchange/logicalstructure/PDStructureElement.java
==============================================================================
---
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/documentinterchange/logicalstructure/PDStructureElement.java
Thu Jul 30 09:03:19 2026 (r1936723)
+++
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/documentinterchange/logicalstructure/PDStructureElement.java
Thu Jul 30 09:03:22 2026 (r1936724)
@@ -17,7 +17,12 @@
package org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure;
import java.util.Collections;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSBase;
@@ -41,6 +46,8 @@ public class PDStructureElement extends
public static final String TYPE = "StructElem";
+ private static final Log LOG = LogFactory.getLog(PDStructureElement.class);
+
/**
* Constructor with required values.
*
@@ -732,9 +739,15 @@ public class PDStructureElement extends
*/
private PDStructureTreeRoot getStructureTreeRoot()
{
+ Set<COSDictionary> visited = new HashSet<>();
PDStructureNode parent = this.getParent();
while (parent instanceof PDStructureElement)
{
+ if (!visited.add(parent.getCOSObject()))
+ {
+ LOG.warn("Element ignored: " + parent.getCOSObject());
+ return null; // Cycle detected
+ }
parent = ((PDStructureElement) parent).getParent();
}
if (parent instanceof PDStructureTreeRoot)