From 0c17bdac6ce07754402385720d3a0e70ce179949 Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Wed, 14 Jun 2017 13:50:05 -0400 Subject: [Merge M59] Allow zero length streams when parsing. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Commit-Queue: dsinclair (cherry picked from commit 957480c17682008ae2a14723868fcdcab89b6577) Reviewed-on: https://pdfium-review.googlesource.com/6556 Reviewed-by: Nicolás Peña --- core/fpdfapi/edit/fpdf_edit_create.cpp | 13 ++++++++----- core/fpdfapi/parser/cpdf_syntax_parser.cpp | 8 ++++---- 2 files changed, 12 insertions(+), 9 deletions(-) (limited to 'core') diff --git a/core/fpdfapi/edit/fpdf_edit_create.cpp b/core/fpdfapi/edit/fpdf_edit_create.cpp index f643d3f24e..4bdb63cb3c 100644 --- a/core/fpdfapi/edit/fpdf_edit_create.cpp +++ b/core/fpdfapi/edit/fpdf_edit_create.cpp @@ -182,12 +182,15 @@ int32_t PDF_CreatorAppendObject(const CPDF_Object* pObj, return -1; } offset += 8; - auto pAcc = pdfium::MakeRetain(p); - pAcc->LoadAllData(true); - if (pFile->AppendBlock(pAcc->GetData(), pAcc->GetSize()) < 0) { - return -1; + if (p->GetRawSize() > 0) { + auto pAcc = pdfium::MakeRetain(p); + pAcc->LoadAllData(true); + + if (pFile->AppendBlock(pAcc->GetData(), pAcc->GetSize()) < 0) { + return -1; + } + offset += pAcc->GetSize(); } - offset += pAcc->GetSize(); if ((len = pFile->AppendString("\r\nendstream")) < 0) { return -1; } diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.cpp b/core/fpdfapi/parser/cpdf_syntax_parser.cpp index ecf2cf6e5b..7b7495dfc6 100644 --- a/core/fpdfapi/parser/cpdf_syntax_parser.cpp +++ b/core/fpdfapi/parser/cpdf_syntax_parser.cpp @@ -724,10 +724,11 @@ std::unique_ptr 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 pData; @@ -745,7 +746,6 @@ std::unique_ptr CPDF_SyntaxParser::ReadStream( pData = dest_buf.DetachBuffer(); } } - auto pStream = pdfium::MakeUnique(std::move(pData), len, std::move(pDict)); streamStartPos = m_Pos; -- cgit v1.2.3