You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pdfbox.apache.org by "Harald Kuhr (JIRA)" <ji...@apache.org> on 2018/06/06 20:23:00 UTC

[jira] [Created] (PDFBOX-4241) PDDocument.save double-closes stream causing exceptions with well-behaving streams

Harald Kuhr created PDFBOX-4241:
-----------------------------------

             Summary: PDDocument.save double-closes stream causing exceptions with well-behaving streams
                 Key: PDFBOX-4241
                 URL: https://issues.apache.org/jira/browse/PDFBOX-4241
             Project: PDFBox
          Issue Type: Bug
    Affects Versions: 2.0.9, 2.0.4
            Reporter: Harald Kuhr


This might be a duplicate of PDFBOX-273, although closed, it is clearly not fixed.

PDDocument save (through COSWriter) closes the output, and to make things worse, it closes it _twice_. Also, it is generally not good practice to close streams, unless you opened them yourself, so I think the streams should just be left alone, and instead the references should be cleared.

The critical code in {{PDDocument.save(OutputStream output)}} is:
{code:java}
COSWriter writer = new COSWriter(output);
try
{
    writer.write(this);
}
finally
{
    writer.close();
}{code}
With {{COSWriter.close()}} being:
{code:java}
public void close() throws IOException
{
    if (getStandardOutput() != null)
    {
      getStandardOutput().close();
    }
    if (getOutput() != null)
    {
        getOutput().close();
    }
    if (incrementalOutput != null)
    {
        incrementalOutput.close();
    }
}
{code}
The problem here is that {{standardOutput}} in this case _wraps_  {{output}}, thus causing a double {{close()}} on {{output}} (as {{FilterOutputStream}} already closes the stream it wraps).

Double closing itself might not have been a problem, but again {{FilterOutputStream.close()}} invokes {{flush()}} in its standard implementation,  and you cannot flush a closed stream...

Example stack trace:
{noformat}
Exception in thread "main" java.io.IOException: stream already closed
at com.twelvemonkeys.imageio.util.IIOOutputStreamAdapter.assertOpen(IIOOutputStreamAdapter.java:80)
at com.twelvemonkeys.imageio.util.IIOOutputStreamAdapter.flush(IIOOutputStreamAdapter.java:75)
at java.io.BufferedOutputStream.flush(Unknown Source)
at java.io.FilterOutputStream.close(Unknown Source)
at org.apache.pdfbox.pdfwriter.COSWriter.close(COSWriter.java:315)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1236)
at com.twelvemonkeys.imageio.plugins.pdf.PDFImageWriter.endWriteSequence(PDFImageWriter.java:83)
at com.twelvemonkeys.imageio.plugins.pdf.PDFImageWriter.main(PDFImageWriter.java:183){noformat}
I tagged the issue with 2.0.4 and 2.0.9 as those are the versions I tested, but I assume the problem is there even before 2.0.4.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: dev-help@pdfbox.apache.org