You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2026/01/26 11:43:40 UTC

svn commit: r1931541 - in pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox: multipdf pdmodel/interactive/documentnavigation/outline

Author: tilman
Date: Mon Jan 26 11:43:38 2026
New Revision: 1931541

Log:
PDFBOX-6153: catch cycles

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

Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java	Mon Jan 26 11:43:32 2026	(r1931540)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java	Mon Jan 26 11:43:38 2026	(r1931541)
@@ -599,9 +599,15 @@ public class PDFMergerUtility
             else
             {
                 // search last sibling for dest, because /Last entry is sometimes wrong
+                Set<COSDictionary> visited = new HashSet<COSDictionary>();
                 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/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItemIterator.java
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItemIterator.java	Mon Jan 26 11:43:32 2026	(r1931540)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItemIterator.java	Mon Jan 26 11:43:38 2026	(r1931541)
@@ -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<COSDictionary>();
 
     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;
     }