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/05/13 16:22:23 UTC
svn commit: r1900861 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFCloneUtility.java
Author: tilman
Date: Fri May 13 16:22:23 2022
New Revision: 1900861
URL: http://svn.apache.org/viewvc?rev=1900861&view=rev
Log:
PDFBOX-5429: don't abort when there is a self-reference, keep it
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFCloneUtility.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFCloneUtility.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFCloneUtility.java?rev=1900861&r1=1900860&r2=1900861&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFCloneUtility.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFCloneUtility.java Fri May 13 16:22:23 2022
@@ -24,6 +24,8 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSDictionary;
@@ -41,6 +43,8 @@ import org.apache.pdfbox.pdmodel.common.
*/
class PDFCloneUtility
{
+ private static final Log LOG = LogFactory.getLog(PDFCloneUtility.class);
+
private final PDDocument destination;
private final Map<Object,COSBase> clonedVersion = new HashMap<>();
private final Set<COSBase> clonedValues = new HashSet<>();
@@ -116,8 +120,14 @@ class PDFCloneUtility
for( int i=0; i<array.size(); i++ )
{
COSBase value = array.get(i);
- checkForRecursion(base, value);
- newArray.add(cloneForNewDocument(value));
+ if (hasSelfReference(base, value))
+ {
+ newArray.add(newArray);
+ }
+ else
+ {
+ newArray.add(cloneForNewDocument(value));
+ }
}
retval = newArray;
}
@@ -134,8 +144,14 @@ class PDFCloneUtility
for( Map.Entry<COSName, COSBase> entry : originalStream.entrySet() )
{
COSBase value = entry.getValue();
- checkForRecursion(base, value);
- stream.setItem(entry.getKey(), cloneForNewDocument(value));
+ if (hasSelfReference(base, value))
+ {
+ stream.setItem(entry.getKey(), stream);
+ }
+ else
+ {
+ stream.setItem(entry.getKey(), cloneForNewDocument(value));
+ }
}
retval = stream;
}
@@ -147,8 +163,14 @@ class PDFCloneUtility
for( Map.Entry<COSName, COSBase> entry : dic.entrySet() )
{
COSBase value = entry.getValue();
- checkForRecursion(base, value);
- ((COSDictionary) retval).setItem(entry.getKey(), cloneForNewDocument(value));
+ if (hasSelfReference(base, value))
+ {
+ ((COSDictionary) retval).setItem(entry.getKey(), retval);
+ }
+ else
+ {
+ ((COSDictionary) retval).setItem(entry.getKey(), cloneForNewDocument(value));
+ }
}
}
else
@@ -265,17 +287,20 @@ class PDFCloneUtility
*
* @param parent COSArray or COSDictionary
* @param value an element
- * @throws IOException if value is an object reference to the parent
*/
- private void checkForRecursion(Object parent, COSBase value) throws IOException
+ private boolean hasSelfReference(Object parent, COSBase value)
{
if (value instanceof COSObject)
{
COSBase actual = ((COSObject) value).getObject();
if (actual == parent)
{
- throw new IOException("Loop within object " + value);
+ COSObject cosObj = ((COSObject) value);
+ LOG.warn(parent.getClass().getSimpleName() + " object has a reference to itself: " +
+ cosObj.getObjectNumber() + " " + cosObj.getGenerationNumber() + " R");
+ return true;
}
}
+ return false;
}
}