diff options
author | Dan Sinclair <dsinclair@chromium.org> | 2017-06-13 15:21:14 -0400 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2017-06-13 19:33:05 +0000 |
commit | 957480c17682008ae2a14723868fcdcab89b6577 (patch) | |
tree | cf5f1cb09c4385b7a107d8c8efcc99ea046849f8 /core/fpdfapi | |
parent | 6500c6faf82f636d55c9ca5682711022890bef1d (diff) | |
download | pdfium-957480c17682008ae2a14723868fcdcab89b6577.tar.xz |
Allow zero length streams when parsing.chromium/3130
It's possible to create a stream of length 0 in a PDF document.
Currently the code will early exit and return a nullptr. This causes
issues when you want to print the given PDF as the FPDF_ImportPages code
ends up only generating up to the zero length object.
This CL allows creating streams with length 0 and updates the PDF saving
code to output a blank stream.
Bug: chromium:732380
Change-Id: I44182ba4aaac7c51284b002ba01bbc34b6bcf9e0
Reviewed-on: https://pdfium-review.googlesource.com/6490
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: dsinclair <dsinclair@chromium.org>
Diffstat (limited to 'core/fpdfapi')
-rw-r--r-- | core/fpdfapi/edit/cpdf_creator.cpp | 14 | ||||
-rw-r--r-- | core/fpdfapi/parser/cpdf_syntax_parser.cpp | 8 |
2 files changed, 15 insertions, 7 deletions
diff --git a/core/fpdfapi/edit/cpdf_creator.cpp b/core/fpdfapi/edit/cpdf_creator.cpp index 1c0cd69a4b..858d56cbaf 100644 --- a/core/fpdfapi/edit/cpdf_creator.cpp +++ b/core/fpdfapi/edit/cpdf_creator.cpp @@ -171,13 +171,21 @@ bool CPDF_Creator::WriteStream(const CPDF_Object* pStream, encoder.GetDict()->SetNewFor<CPDF_Number>( "Length", static_cast<int>(encryptor.GetSize())); } + if (!WriteDirectObj(objnum, encoder.GetDict(), true) || - !m_Archive->WriteString("stream\r\n") || - !m_Archive->WriteBlock(encryptor.GetData(), encryptor.GetSize()) || - !m_Archive->WriteString("\r\nendstream")) { + !m_Archive->WriteString("stream\r\n")) { + return false; + } + + // Allow for empty streams. + if (encryptor.GetSize() > 0 && + !m_Archive->WriteBlock(encryptor.GetData(), encryptor.GetSize())) { return false; } + if (!m_Archive->WriteString("\r\nendstream")) + return false; + return true; } diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.cpp b/core/fpdfapi/parser/cpdf_syntax_parser.cpp index fe1a197028..9dccbd936e 100644 --- a/core/fpdfapi/parser/cpdf_syntax_parser.cpp +++ b/core/fpdfapi/parser/cpdf_syntax_parser.cpp @@ -725,10 +725,11 @@ std::unique_ptr<CPDF_Stream> CPDF_SyntaxParser::ReadStream( } m_Pos = streamStartPos; } - - // Read up to the end of the buffer. + // Read up to the end of the buffer. Note, we allow zero length streams as + // we need to pass them through when we are importing pages into a new + // document. len = std::min(len, m_FileLen - m_Pos - m_HeaderOffset); - if (len <= 0) + if (len < 0) return nullptr; std::unique_ptr<uint8_t, FxFreeDeleter> pData; @@ -746,7 +747,6 @@ std::unique_ptr<CPDF_Stream> CPDF_SyntaxParser::ReadStream( pData = dest_buf.DetachBuffer(); } } - auto pStream = pdfium::MakeUnique<CPDF_Stream>(std::move(pData), len, std::move(pDict)); streamStartPos = m_Pos; |