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);
+ }
+ }
+ }
}