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 da3c8b0c799b85183cff29974f62f456f2e0159c..842ef2b22201143cbda709303041412adf3c8a30 100644 |
--- a/core/fpdfapi/parser/cpdf_syntax_parser.cpp |
+++ b/core/fpdfapi/parser/cpdf_syntax_parser.cpp |
@@ -23,6 +23,7 @@ |
#include "core/fpdfapi/parser/fpdf_parser_utility.h" |
#include "core/fxcrt/fx_ext.h" |
#include "third_party/base/numerics/safe_math.h" |
+#include "third_party/base/ptr_util.h" |
namespace { |
@@ -362,10 +363,11 @@ CFX_ByteString CPDF_SyntaxParser::GetKeyword() { |
return GetNextWord(nullptr); |
} |
-CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, |
- uint32_t objnum, |
- uint32_t gennum, |
- bool bDecrypt) { |
+std::unique_ptr<CPDF_Object> CPDF_SyntaxParser::GetObject( |
+ CPDF_IndirectObjectHolder* pObjList, |
+ uint32_t objnum, |
+ uint32_t gennum, |
+ bool bDecrypt) { |
CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); |
if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) |
return nullptr; |
@@ -381,51 +383,50 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, |
CFX_ByteString nextword = GetNextWord(&bIsNumber); |
if (bIsNumber) { |
CFX_ByteString nextword2 = GetNextWord(nullptr); |
- if (nextword2 == "R") |
- return new CPDF_Reference(pObjList, FXSYS_atoui(word.c_str())); |
+ if (nextword2 == "R") { |
+ return pdfium::MakeUnique<CPDF_Reference>(pObjList, |
+ FXSYS_atoui(word.c_str())); |
+ } |
} |
m_Pos = SavedPos; |
- return new CPDF_Number(word.AsStringC()); |
+ return pdfium::MakeUnique<CPDF_Number>(word.AsStringC()); |
} |
if (word == "true" || word == "false") |
- return new CPDF_Boolean(word == "true"); |
+ return pdfium::MakeUnique<CPDF_Boolean>(word == "true"); |
if (word == "null") |
- return new CPDF_Null; |
+ return pdfium::MakeUnique<CPDF_Null>(); |
if (word == "(") { |
CFX_ByteString str = ReadString(); |
if (m_pCryptoHandler && bDecrypt) |
m_pCryptoHandler->Decrypt(objnum, gennum, str); |
- return new CPDF_String(MaybeIntern(str), false); |
+ return pdfium::MakeUnique<CPDF_String>(MaybeIntern(str), false); |
} |
- |
if (word == "<") { |
CFX_ByteString str = ReadHexString(); |
if (m_pCryptoHandler && bDecrypt) |
m_pCryptoHandler->Decrypt(objnum, gennum, str); |
- return new CPDF_String(MaybeIntern(str), true); |
+ return pdfium::MakeUnique<CPDF_String>(MaybeIntern(str), true); |
} |
- |
if (word == "[") { |
- CPDF_Array* pArray = new CPDF_Array; |
- while (CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, true)) |
- pArray->Add(pObj); |
- |
- return pArray; |
+ std::unique_ptr<CPDF_Array> pArray = pdfium::MakeUnique<CPDF_Array>(); |
+ while (std::unique_ptr<CPDF_Object> pObj = |
+ GetObject(pObjList, objnum, gennum, true)) { |
+ pArray->Add(pObj.release()); |
+ } |
+ return std::move(pArray); |
} |
- |
if (word[0] == '/') { |
- return new CPDF_Name(MaybeIntern( |
+ return pdfium::MakeUnique<CPDF_Name>(MaybeIntern( |
PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)))); |
} |
- |
if (word == "<<") { |
int32_t nKeys = 0; |
FX_FILESIZE dwSignValuePos = 0; |
- |
- std::unique_ptr<CPDF_Dictionary> pDict(new CPDF_Dictionary(m_pPool)); |
+ std::unique_ptr<CPDF_Dictionary> pDict = |
+ pdfium::MakeUnique<CPDF_Dictionary>(m_pPool); |
while (1) { |
CFX_ByteString key = GetNextWord(nullptr); |
if (key.IsEmpty()) |
@@ -439,7 +440,6 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, |
m_Pos = SavedPos; |
break; |
} |
- |
if (key[0] != '/') |
continue; |
@@ -451,12 +451,13 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, |
if (key == "/Contents") |
dwSignValuePos = m_Pos; |
- CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, true); |
+ std::unique_ptr<CPDF_Object> pObj = |
+ GetObject(pObjList, objnum, gennum, true); |
if (!pObj) |
continue; |
CFX_ByteString keyNoSlash(key.raw_str() + 1, key.GetLength() - 1); |
- pDict->SetFor(keyNoSlash, pObj); |
+ pDict->SetFor(keyNoSlash, pObj.release()); |
} |
// Only when this is a signature dictionary and has contents, we reset the |
@@ -464,14 +465,15 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, |
if (pDict->IsSignatureDict() && dwSignValuePos) { |
CFX_AutoRestorer<FX_FILESIZE> save_pos(&m_Pos); |
m_Pos = dwSignValuePos; |
- pDict->SetFor("Contents", GetObject(pObjList, objnum, gennum, false)); |
+ pDict->SetFor("Contents", |
+ GetObject(pObjList, objnum, gennum, false).release()); |
} |
FX_FILESIZE SavedPos = m_Pos; |
CFX_ByteString nextword = GetNextWord(nullptr); |
if (nextword != "stream") { |
m_Pos = SavedPos; |
- return pDict.release(); |
+ return std::move(pDict); |
} |
return ReadStream(pDict.release(), objnum, gennum); |
} |
@@ -482,7 +484,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, |
return nullptr; |
} |
-CPDF_Object* CPDF_SyntaxParser::GetObjectForStrict( |
+std::unique_ptr<CPDF_Object> CPDF_SyntaxParser::GetObjectForStrict( |
CPDF_IndirectObjectHolder* pObjList, |
uint32_t objnum, |
uint32_t gennum) { |
@@ -501,48 +503,48 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectForStrict( |
CFX_ByteString nextword = GetNextWord(&bIsNumber); |
if (bIsNumber) { |
CFX_ByteString nextword2 = GetNextWord(nullptr); |
- if (nextword2 == "R") |
- return new CPDF_Reference(pObjList, FXSYS_atoui(word.c_str())); |
+ if (nextword2 == "R") { |
+ return pdfium::MakeUnique<CPDF_Reference>(pObjList, |
+ FXSYS_atoui(word.c_str())); |
+ } |
} |
m_Pos = SavedPos; |
- return new CPDF_Number(word.AsStringC()); |
+ return pdfium::MakeUnique<CPDF_Number>(word.AsStringC()); |
} |
if (word == "true" || word == "false") |
- return new CPDF_Boolean(word == "true"); |
+ return pdfium::MakeUnique<CPDF_Boolean>(word == "true"); |
if (word == "null") |
- return new CPDF_Null; |
+ return pdfium::MakeUnique<CPDF_Null>(); |
if (word == "(") { |
CFX_ByteString str = ReadString(); |
if (m_pCryptoHandler) |
m_pCryptoHandler->Decrypt(objnum, gennum, str); |
- return new CPDF_String(MaybeIntern(str), false); |
+ return pdfium::MakeUnique<CPDF_String>(MaybeIntern(str), false); |
} |
- |
if (word == "<") { |
CFX_ByteString str = ReadHexString(); |
if (m_pCryptoHandler) |
m_pCryptoHandler->Decrypt(objnum, gennum, str); |
- return new CPDF_String(MaybeIntern(str), true); |
+ return pdfium::MakeUnique<CPDF_String>(MaybeIntern(str), true); |
} |
- |
if (word == "[") { |
- std::unique_ptr<CPDF_Array> pArray(new CPDF_Array); |
- while (CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, true)) |
- pArray->Add(pObj); |
- |
- return m_WordBuffer[0] == ']' ? pArray.release() : nullptr; |
+ std::unique_ptr<CPDF_Array> pArray = pdfium::MakeUnique<CPDF_Array>(); |
+ while (std::unique_ptr<CPDF_Object> pObj = |
+ GetObject(pObjList, objnum, gennum, true)) { |
+ pArray->Add(pObj.release()); |
+ } |
+ return m_WordBuffer[0] == ']' ? std::move(pArray) : nullptr; |
} |
- |
if (word[0] == '/') { |
- return new CPDF_Name(MaybeIntern( |
+ return pdfium::MakeUnique<CPDF_Name>(MaybeIntern( |
PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)))); |
} |
- |
if (word == "<<") { |
- std::unique_ptr<CPDF_Dictionary> pDict(new CPDF_Dictionary(m_pPool)); |
+ std::unique_ptr<CPDF_Dictionary> pDict = |
+ pdfium::MakeUnique<CPDF_Dictionary>(m_pPool); |
while (1) { |
FX_FILESIZE SavedPos = m_Pos; |
CFX_ByteString key = GetNextWord(nullptr); |
@@ -556,7 +558,6 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectForStrict( |
m_Pos = SavedPos; |
break; |
} |
- |
if (key[0] != '/') |
continue; |
@@ -581,7 +582,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectForStrict( |
CFX_ByteString nextword = GetNextWord(nullptr); |
if (nextword != "stream") { |
m_Pos = SavedPos; |
- return pDict.release(); |
+ return std::move(pDict); |
} |
return ReadStream(pDict.release(), objnum, gennum); |
@@ -609,9 +610,10 @@ unsigned int CPDF_SyntaxParser::ReadEOLMarkers(FX_FILESIZE pos) { |
return 0; |
} |
-CPDF_Stream* CPDF_SyntaxParser::ReadStream(CPDF_Dictionary* pDict, |
- uint32_t objnum, |
- uint32_t gennum) { |
+std::unique_ptr<CPDF_Stream> CPDF_SyntaxParser::ReadStream( |
+ CPDF_Dictionary* pDict, |
+ uint32_t objnum, |
+ uint32_t gennum) { |
CPDF_Object* pLenObj = pDict->GetObjectFor("Length"); |
FX_FILESIZE len = -1; |
CPDF_Reference* pLenObjRef = ToReference(pLenObj); |
@@ -747,10 +749,9 @@ CPDF_Stream* CPDF_SyntaxParser::ReadStream(CPDF_Dictionary* pDict, |
} |
} |
- CPDF_Stream* pStream = new CPDF_Stream(pData, len, pDict); |
+ auto pStream = pdfium::MakeUnique<CPDF_Stream>(pData, len, pDict); |
streamStartPos = m_Pos; |
FXSYS_memset(m_WordBuffer, 0, kEndObjStr.GetLength() + 1); |
- |
GetNextWordInternal(nullptr); |
int numMarkers = ReadEOLMarkers(m_Pos); |