| Index: core/fpdfapi/parser/cpdf_syntax_parser.cpp
|
| diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.cpp b/core/fpdfapi/parser/cpdf_syntax_parser.cpp
|
| index 17e4954f2abf4ba78c09c97c2bfa6e713bc14c4b..9beae0b7f7ffac229be729def798a09e70bba787 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);
|
|
|