You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2022/08/11 11:00:49 UTC

svn commit: r1903348 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/compress/COSWriterObjectStream.java

Author: lehmi
Date: Thu Aug 11 11:00:49 2022
New Revision: 1903348

URL: http://svn.apache.org/viewvc?rev=1903348&view=rev
Log:
PDFBOX-5485: avaoid StackOverflowException

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/compress/COSWriterObjectStream.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/compress/COSWriterObjectStream.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/compress/COSWriterObjectStream.java?rev=1903348&r1=1903347&r2=1903348&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/compress/COSWriterObjectStream.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/compress/COSWriterObjectStream.java Thu Aug 11 11:00:49 2022
@@ -179,17 +179,25 @@ public class COSWriterObjectStream
         {
             throw new IOException("Error: Unknown type in object stream:" + object);
         }
-        COSBase base = object instanceof COSObject ? ((COSObject) object).getObject()
-                : (COSBase) object;
-        if (base == null)
+        COSBase base = null;
+        if (object instanceof COSObject)
         {
-            // the object reference can't be dereferenced
-            // be lenient and write the reference nevertheless
-            if (!topLevel && object instanceof COSObject)
+            base = ((COSObject) object).getObject();
+            if (!topLevel)
             {
-                writeObjectReference(output, ((COSObject) object).getKey());
+                COSObjectKey actualKey = ((COSObject) object).getKey();
+                // the object reference can't be dereferenced be lenient and write the reference nevertheless
+                // or the object is part of a compressed object stream and shouldn't be written directly
+                if (base == null || (actualKey != null && preparedKeys.contains(actualKey)))
+                {
+                    writeObjectReference(output, actualKey);
+                    return;
+                }
             }
-            return;
+        }
+        else
+        {
+            base = (COSBase) object;
         }
         if (!topLevel && this.compressionPool.contains(base))
         {
@@ -200,8 +208,9 @@ public class COSWriterObjectStream
                         "Error: Adding unknown object reference to object stream:" + object);
             }
             writeObjectReference(output, key);
+            return;
         }
-        else if (base instanceof COSString)
+        if (base instanceof COSString)
         {
             writeCOSString(output, (COSString) base);
         }