Author: tilman
Date: Mon Jan 26 11:43:25 2026
New Revision: 1931539
Log:
PDFBOX-6153: catch cycles
Modified:
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItemIterator.java
Modified:
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
==============================================================================
---
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
Mon Jan 26 08:30:16 2026 (r1931538)
+++
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
Mon Jan 26 11:43:25 2026 (r1931539)
@@ -603,9 +603,15 @@ public class PDFMergerUtility
else
{
// search last sibling for dest, because /Last entry is
sometimes wrong
+ Set<COSDictionary> visited = new HashSet<>();
PDOutlineItem destLastOutlineItem =
destOutline.getFirstChild();
while (true)
{
+ if (!visited.add(destLastOutlineItem.getCOSObject()))
+ {
+ LOG.warn("Outline ignored: " +
destLastOutlineItem.getCOSObject());
+ break; // Cycle detected
+ }
PDOutlineItem outlineItem =
destLastOutlineItem.getNextSibling();
if (outlineItem == null)
{
Modified:
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItemIterator.java
==============================================================================
---
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItemIterator.java
Mon Jan 26 08:30:16 2026 (r1931538)
+++
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItemIterator.java
Mon Jan 26 11:43:25 2026 (r1931539)
@@ -16,8 +16,11 @@
*/
package org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.NoSuchElementException;
+import java.util.Set;
+import org.apache.pdfbox.cos.COSDictionary;
/**
* Iterator over the linked list of {@link PDOutlineItem} siblings.
@@ -29,6 +32,7 @@ class PDOutlineItemIterator implements I
{
private PDOutlineItem currentItem;
private final PDOutlineItem startingItem;
+ private final Set<COSDictionary> visited = new HashSet<>();
PDOutlineItemIterator(PDOutlineItem startingItem)
{
@@ -47,7 +51,7 @@ class PDOutlineItemIterator implements I
return true;
}
PDOutlineItem sibling = currentItem.getNextSibling();
- return sibling != null && !startingItem.equals(sibling);
+ return sibling != null && !visited.contains(sibling.getCOSObject());
}
@Override
@@ -65,6 +69,7 @@ class PDOutlineItemIterator implements I
{
currentItem = currentItem.getNextSibling();
}
+ visited.add(currentItem.getCOSObject());
return currentItem;
}