Author: tilman
Date: Mon Jan 26 11:43:32 2026
New Revision: 1931540

Log:
PDFBOX-6153: catch cycles

Modified:
   
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
   
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItemIterator.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
  Mon Jan 26 11:43:25 2026        (r1931539)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
  Mon Jan 26 11:43:32 2026        (r1931540)
@@ -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/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItemIterator.java
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItemIterator.java
       Mon Jan 26 11:43:25 2026        (r1931539)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItemIterator.java
       Mon Jan 26 11:43:32 2026        (r1931540)
@@ -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;
     }
 

Reply via email to