diff options
Diffstat (limited to 'core/fpdfapi/parser')
-rw-r--r-- | core/fpdfapi/parser/cpdf_syntax_parser.cpp | 30 | ||||
-rw-r--r-- | core/fpdfapi/parser/cpdf_syntax_parser.h | 7 |
2 files changed, 13 insertions, 24 deletions
diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.cpp b/core/fpdfapi/parser/cpdf_syntax_parser.cpp index 17e4954f2a..9beae0b7f7 100644 --- a/core/fpdfapi/parser/cpdf_syntax_parser.cpp +++ b/core/fpdfapi/parser/cpdf_syntax_parser.cpp @@ -477,9 +477,8 @@ std::unique_ptr<CPDF_Object> CPDF_SyntaxParser::GetObject( m_Pos = SavedPos; return std::move(pDict); } - return ReadStream(pDict.release(), objnum, gennum); + return ReadStream(std::move(pDict), objnum, gennum); } - if (word == ">>") m_Pos = SavedObjPos; @@ -587,10 +586,8 @@ std::unique_ptr<CPDF_Object> CPDF_SyntaxParser::GetObjectForStrict( m_Pos = SavedPos; return std::move(pDict); } - - return ReadStream(pDict.release(), objnum, gennum); + return ReadStream(std::move(pDict), objnum, gennum); } - if (word == ">>") m_Pos = SavedObjPos; @@ -614,7 +611,7 @@ unsigned int CPDF_SyntaxParser::ReadEOLMarkers(FX_FILESIZE pos) { } std::unique_ptr<CPDF_Stream> CPDF_SyntaxParser::ReadStream( - CPDF_Dictionary* pDict, + std::unique_ptr<CPDF_Dictionary> pDict, uint32_t objnum, uint32_t gennum) { CPDF_Object* pLenObj = pDict->GetObjectFor("Length"); @@ -693,10 +690,8 @@ std::unique_ptr<CPDF_Stream> CPDF_SyntaxParser::ReadStream( } // Can't find "endstream" or "endobj". - if (endStreamOffset < 0 && endObjOffset < 0) { - delete pDict; + if (endStreamOffset < 0 && endObjOffset < 0) return nullptr; - } if (endStreamOffset < 0 && endObjOffset >= 0) { // Correct the position of end stream. @@ -707,8 +702,8 @@ std::unique_ptr<CPDF_Stream> CPDF_SyntaxParser::ReadStream( } else if (endStreamOffset > endObjOffset) { endStreamOffset = endObjOffset; } - len = endStreamOffset; + int numMarkers = ReadEOLMarkers(streamStartPos + endStreamOffset - 2); if (numMarkers == 2) { len -= 2; @@ -718,20 +713,15 @@ std::unique_ptr<CPDF_Stream> CPDF_SyntaxParser::ReadStream( len -= 1; } } - - if (len < 0) { - delete pDict; + if (len < 0) return nullptr; - } + pDict->SetNewFor<CPDF_Number>("Length", static_cast<int>(len)); } m_Pos = streamStartPos; } - - if (len < 0) { - delete pDict; + if (len < 0) return nullptr; - } uint8_t* pData = nullptr; if (len > 0) { @@ -744,7 +734,6 @@ std::unique_ptr<CPDF_Stream> CPDF_SyntaxParser::ReadStream( void* context = pCryptoHandler->DecryptStart(objnum, gennum); pCryptoHandler->DecryptStream(context, pData, len, dest_buf); pCryptoHandler->DecryptFinish(context, dest_buf); - FX_Free(pData); pData = dest_buf.GetBuffer(); len = dest_buf.GetSize(); @@ -752,8 +741,7 @@ std::unique_ptr<CPDF_Stream> CPDF_SyntaxParser::ReadStream( } } - auto pStream = - pdfium::MakeUnique<CPDF_Stream>(pData, len, pdfium::WrapUnique(pDict)); + auto pStream = pdfium::MakeUnique<CPDF_Stream>(pData, len, std::move(pDict)); streamStartPos = m_Pos; FXSYS_memset(m_WordBuffer, 0, kEndObjStr.GetLength() + 1); GetNextWordInternal(nullptr); diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.h b/core/fpdfapi/parser/cpdf_syntax_parser.h index 094872ab70..1e8f736c17 100644 --- a/core/fpdfapi/parser/cpdf_syntax_parser.h +++ b/core/fpdfapi/parser/cpdf_syntax_parser.h @@ -75,9 +75,10 @@ class CPDF_SyntaxParser { CFX_ByteString ReadString(); CFX_ByteString ReadHexString(); unsigned int ReadEOLMarkers(FX_FILESIZE pos); - std::unique_ptr<CPDF_Stream> ReadStream(CPDF_Dictionary* pDict, - uint32_t objnum, - uint32_t gennum); + std::unique_ptr<CPDF_Stream> ReadStream( + std::unique_ptr<CPDF_Dictionary> pDict, + uint32_t objnum, + uint32_t gennum); inline bool CheckPosition(FX_FILESIZE pos) { return m_BufOffset >= pos || |