Author: tilman
Date: Thu Jul 30 09:03:26 2026
New Revision: 1936725
Log:
PDFBOX-6228: catch cycle
Modified:
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/documentinterchange/logicalstructure/PDStructureElement.java
Modified:
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/documentinterchange/logicalstructure/PDStructureElement.java
==============================================================================
---
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/documentinterchange/logicalstructure/PDStructureElement.java
Thu Jul 30 09:03:22 2026 (r1936724)
+++
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/documentinterchange/logicalstructure/PDStructureElement.java
Thu Jul 30 09:03:26 2026 (r1936725)
@@ -16,7 +16,12 @@
*/
package org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure;
+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;
@@ -40,6 +45,8 @@ public class PDStructureElement extends
public static final String TYPE = "StructElem";
+ private static final Log LOG = LogFactory.getLog(PDStructureElement.class);
+
/**
* Constructor with required values.
*
@@ -739,9 +746,15 @@ public class PDStructureElement extends
*/
private PDStructureTreeRoot getStructureTreeRoot()
{
+ Set<COSDictionary> visited = new HashSet<COSDictionary>();
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)