Index: core/fpdfapi/fpdf_parser/cpdf_syntax_parser.cpp |
diff --git a/core/fpdfapi/fpdf_parser/cpdf_syntax_parser.cpp b/core/fpdfapi/fpdf_parser/cpdf_syntax_parser.cpp |
index 4bfaf99ed953d2dca089dda388d9a2922b82e7ac..a29137cd4315a8c185709be10ce1dcd34aed168f 100644 |
--- a/core/fpdfapi/fpdf_parser/cpdf_syntax_parser.cpp |
+++ b/core/fpdfapi/fpdf_parser/cpdf_syntax_parser.cpp |
@@ -37,10 +37,15 @@ struct SearchTagRecord { |
int CPDF_SyntaxParser::s_CurrentRecursionDepth = 0; |
CPDF_SyntaxParser::CPDF_SyntaxParser() |
+ : CPDF_SyntaxParser(CFX_WeakPtr<CFX_ByteStringPool>()) {} |
+ |
+CPDF_SyntaxParser::CPDF_SyntaxParser( |
+ const CFX_WeakPtr<CFX_ByteStringPool>& pPool) |
: m_MetadataObjnum(0), |
m_pFileAccess(nullptr), |
m_pFileBuf(nullptr), |
- m_BufSize(CPDF_ModuleMgr::kFileBufSize) {} |
+ m_BufSize(CPDF_ModuleMgr::kFileBufSize), |
+ m_pPool(pPool) {} |
CPDF_SyntaxParser::~CPDF_SyntaxParser() { |
FX_Free(m_pFileBuf); |
@@ -409,15 +414,14 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, |
CFX_ByteString str = ReadString(); |
if (m_pCryptoHandler && bDecrypt) |
m_pCryptoHandler->Decrypt(objnum, gennum, str); |
- return new CPDF_String(str, FALSE); |
+ return new 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(str, TRUE); |
+ return new CPDF_String(MaybeIntern(str), TRUE); |
} |
if (word == "[") { |
@@ -429,8 +433,8 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, |
} |
if (word[0] == '/') { |
- return new CPDF_Name( |
- PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1))); |
+ return new CPDF_Name(MaybeIntern( |
+ PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)))); |
} |
if (word == "<<") { |
@@ -438,7 +442,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, |
FX_FILESIZE dwSignValuePos = 0; |
std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( |
- new CPDF_Dictionary); |
+ new CPDF_Dictionary(m_pPool)); |
while (1) { |
CFX_ByteString key = GetNextWord(nullptr); |
if (key.IsEmpty()) |
@@ -531,14 +535,14 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectForStrict( |
CFX_ByteString str = ReadString(); |
if (m_pCryptoHandler) |
m_pCryptoHandler->Decrypt(objnum, gennum, str); |
- return new CPDF_String(str, FALSE); |
+ return new CPDF_String(MaybeIntern(str), FALSE); |
} |
if (word == "<") { |
CFX_ByteString str = ReadHexString(); |
if (m_pCryptoHandler) |
m_pCryptoHandler->Decrypt(objnum, gennum, str); |
- return new CPDF_String(str, TRUE); |
+ return new CPDF_String(MaybeIntern(str), TRUE); |
} |
if (word == "[") { |
@@ -551,13 +555,13 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectForStrict( |
} |
if (word[0] == '/') { |
- return new CPDF_Name( |
- PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1))); |
+ return new CPDF_Name(MaybeIntern( |
+ PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)))); |
} |
if (word == "<<") { |
std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( |
- new CPDF_Dictionary); |
+ new CPDF_Dictionary(m_pPool)); |
while (1) { |
FX_FILESIZE SavedPos = m_Pos; |
CFX_ByteString key = GetNextWord(nullptr); |
@@ -987,3 +991,7 @@ void CPDF_SyntaxParser::SetEncrypt( |
std::unique_ptr<CPDF_CryptoHandler> pCryptoHandler) { |
m_pCryptoHandler = std::move(pCryptoHandler); |
} |
+ |
+CFX_ByteString CPDF_SyntaxParser::MaybeIntern(const CFX_ByteString& str) { |
+ return m_pPool ? m_pPool->Intern(str) : str; |
+} |