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