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 2020/09/05 16:29:17 UTC

svn commit: r1881498 - in /pdfbox/trunk/pdfbox/src: main/java/org/apache/pdfbox/cos/ main/java/org/apache/pdfbox/pdfwriter/ main/java/org/apache/pdfbox/pdmodel/encryption/ test/java/org/apache/pdfbox/cos/

Author: lehmi
Date: Sat Sep  5 16:29:17 2020
New Revision: 1881498

URL: http://svn.apache.org/viewvc?rev=1881498&view=rev
Log:
PDFBOX-4836: throw IOException if createRawInputStream is called on an empty stream

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSStream.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/SecurityHandler.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSStream.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSStream.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSStream.java?rev=1881498&r1=1881497&r2=1881498&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSStream.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSStream.java Sat Sep  5 16:29:17 2020
@@ -176,28 +176,6 @@ public class COSStream extends COSDictio
     }
 
     /**
-     * Ensures {@link #randomAccess} is not <code>null</code> by creating a
-     * buffer from {@link #scratchFile} if needed.
-     * 
-     * @param forInputStream  if <code>true</code> and {@link #randomAccess} is <code>null</code>
-     *                        a debug message is logged - input stream should be retrieved after
-     *                        data being written to stream
-     * @throws IOException
-     */
-    private void ensureRandomAccessExists(boolean forInputStream) throws IOException
-    {
-        if (randomAccess == null)
-        {
-            if (forInputStream && LOG.isDebugEnabled())
-            {
-                // no data written to stream - maybe this should be an exception
-                LOG.debug("Create InputStream called without data being written before to stream.");
-            }
-            randomAccess = scratchFile.createBuffer();
-        }
-    }
-    
-    /**
      * Returns a new InputStream which reads the encoded PDF stream data. Experts only!
      * 
      * @return InputStream containing raw, encoded PDF stream data.
@@ -210,14 +188,21 @@ public class COSStream extends COSDictio
         {
             throw new IllegalStateException("Cannot read while there is an open stream writer");
         }
-        if (randomAccess == null && randomAccessReadView != null)
+        if (randomAccess == null)
         {
-            randomAccessReadView.seek(0);
-            return new RandomAccessInputStream(randomAccessReadView);
+            if (randomAccessReadView != null)
+            {
+                randomAccessReadView.seek(0);
+                return new RandomAccessInputStream(randomAccessReadView);
+            }
+            else
+            {
+                throw new IOException(
+                        "Create InputStream called without data being written before to stream.");
+            }
         }
         else
         {
-            ensureRandomAccessExists(true);
             return new RandomAccessInputStream(randomAccess);
         }
     }
@@ -481,4 +466,14 @@ public class COSStream extends COSDictio
             randomAccessReadView = null;
         }
     }
+
+    /**
+     * Indicates wether the stream contains any data or not.
+     * 
+     * @return true if the stream contains any data
+     */
+    public boolean hasData()
+    {
+        return randomAccess != null || randomAccessReadView != null;
+    }
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java?rev=1881498&r1=1881497&r2=1881498&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java Sat Sep  5 16:29:17 2020
@@ -1210,10 +1210,11 @@ public class COSWriter implements ICOSVi
             visitFromDictionary(obj);
             getStandardOutput().write(STREAM);
             getStandardOutput().writeCRLF();
-
-            input = obj.createRawInputStream();
-            IOUtils.copy(input, getStandardOutput());
-         
+            if (obj.hasData())
+            {
+                input = obj.createRawInputStream();
+                IOUtils.copy(input, getStandardOutput());
+            }
             getStandardOutput().writeCRLF();
             getStandardOutput().write(ENDSTREAM);
             getStandardOutput().writeEOL();

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/SecurityHandler.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/SecurityHandler.java?rev=1881498&r1=1881497&r2=1881498&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/SecurityHandler.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/encryption/SecurityHandler.java Sat Sep  5 16:29:17 2020
@@ -520,6 +520,11 @@ public abstract class SecurityHandler
      */
     public void encryptStream(COSStream stream, long objNum, int genNum) throws IOException
     {
+        // empty streams don't need to be encrypted
+        if (!stream.hasData())
+        {
+            return;
+        }
         byte[] rawData = IOUtils.toByteArray(stream.createRawInputStream());
         ByteArrayInputStream encryptedStream = new ByteArrayInputStream(rawData);
         try (OutputStream output = stream.createRawOutputStream())

Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSStream.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSStream.java?rev=1881498&r1=1881497&r2=1881498&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSStream.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSStream.java Sat Sep  5 16:29:17 2020
@@ -150,6 +150,29 @@ public class TestCOSStream extends TestC
         validateEncoded(stream, testStringEncoded);
     }
 
+    public void testHasStreamData() throws IOException
+    {
+        COSStream stream = new COSStream();
+        assertFalse(stream.hasData());
+
+        try
+        {
+            stream.createInputStream();
+            fail("createInputStream should have thrown an IOException");
+        }
+        catch (IOException e)
+        {
+        }
+
+        byte[] testString = "This is a test string to be used as input for TestCOSStream"
+                .getBytes("ASCII");
+        OutputStream output = stream.createOutputStream();
+        output.write(testString);
+        output.close();
+        assertTrue(stream.hasData());
+        stream.close();
+    }
+
     private byte[] encodeData(byte[] original, COSName filter) throws IOException
     {
         Filter encodingFilter = FilterFactory.INSTANCE.getFilter(filter);