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 2022/02/22 17:30:33 UTC

svn commit: r1898324 - /pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFCloneUtility.java

Author: tilman
Date: Tue Feb 22 17:30:33 2022
New Revision: 1898324

URL: http://svn.apache.org/viewvc?rev=1898324&view=rev
Log:
PDFBOX-5372: check for recursion

Modified:
    pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFCloneUtility.java

Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFCloneUtility.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFCloneUtility.java?rev=1898324&r1=1898323&r2=1898324&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFCloneUtility.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFCloneUtility.java Tue Feb 22 17:30:33 2022
@@ -114,7 +114,9 @@ public class PDFCloneUtility
               COSArray array = (COSArray)base;
               for( int i=0; i<array.size(); i++ )
               {
-                  newArray.add( cloneForNewDocument( array.get( i ) ) );
+                  COSBase value = array.get(i);
+                  checkForRecursion((COSBase) base, value);
+                  newArray.add(cloneForNewDocument(value));
               }
               retval = newArray;
           }
@@ -130,7 +132,9 @@ public class PDFCloneUtility
               clonedVersion.put( base, stream );
               for( Map.Entry<COSName, COSBase> entry :  originalStream.entrySet() )
               {
-                  stream.setItem(entry.getKey(), cloneForNewDocument(entry.getValue()));
+                  COSBase value = entry.getValue();
+                  checkForRecursion((COSBase) base, value);
+                  stream.setItem(entry.getKey(), cloneForNewDocument(value));
               }
               retval = stream;
           }
@@ -141,9 +145,9 @@ public class PDFCloneUtility
               clonedVersion.put( base, retval );
               for( Map.Entry<COSName, COSBase> entry : dic.entrySet() )
               {
-                  ((COSDictionary)retval).setItem(
-                          entry.getKey(),
-                          cloneForNewDocument(entry.getValue()));
+                  COSBase value = entry.getValue();
+                  checkForRecursion((COSBase) base, value);
+                  ((COSDictionary) retval).setItem(entry.getKey(), cloneForNewDocument(value));
               }
           }
           else
@@ -255,4 +259,23 @@ public class PDFCloneUtility
           clonedVersion.put( base, retval );
           clonedValues.add(retval);
       }
+
+    /**
+     * Check whether an element (of an array or a dictionary) points to its parent.
+     *
+     * @param parent COSArray or COSDictionary
+     * @param value an element
+     * @throws IOException if value is an object reference to the parent
+     */
+    private void checkForRecursion(COSBase parent, COSBase value) throws IOException
+    {
+        if (value instanceof COSObject)
+        {
+            COSBase actual = ((COSObject) value).getObject();
+            if (actual == parent)
+            {
+                throw new IOException("Loop within object " + value);
+            }
+        }
+    }
 }