Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
index 0b93107e62016898d5c40b21dd593e3676dee193..6cf8b7841e4760258beaf75ed16916cb5e7b8907 100644 |
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
@@ -296,8 +296,7 @@ FX_DWORD CPDF_Parser::SetEncryptHandler() { |
if (CPDF_Dictionary* pEncryptDict = pEncryptObj->AsDictionary()) { |
SetEncryptDictionary(pEncryptDict); |
} else if (CPDF_Reference* pRef = pEncryptObj->AsReference()) { |
- pEncryptObj = |
- m_pDocument->GetIndirectObject(pRef->GetRefObjNum(), nullptr); |
+ pEncryptObj = m_pDocument->GetIndirectObject(pRef->GetRefObjNum()); |
if (pEncryptObj) |
SetEncryptDictionary(pEncryptObj->GetDict()); |
} |
@@ -789,7 +788,7 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
} |
FX_FILESIZE obj_end = 0; |
CPDF_Object* pObject = ParseIndirectObjectAtByStrict( |
- m_pDocument, obj_pos, objnum, NULL, &obj_end); |
+ m_pDocument, obj_pos, objnum, &obj_end); |
if (CPDF_Stream* pStream = ToStream(pObject)) { |
if (CPDF_Dictionary* pDict = pStream->GetDict()) { |
if ((pDict->KeyExist("Type")) && |
@@ -849,8 +848,7 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
if (PDFCharIsWhitespace(byte) || PDFCharIsDelimiter(byte)) { |
last_trailer = pos + i - 7; |
m_Syntax.RestorePos(pos + i - m_Syntax.m_HeaderOffset); |
- CPDF_Object* pObj = |
- m_Syntax.GetObject(m_pDocument, 0, 0, nullptr, true); |
+ CPDF_Object* pObj = m_Syntax.GetObject(m_pDocument, 0, 0, true); |
if (pObj) { |
if (!pObj->IsDictionary() && !pObj->AsStream()) { |
pObj->Release(); |
@@ -998,7 +996,7 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
} |
FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE* pos, FX_BOOL bMainXRef) { |
- CPDF_Object* pObject = ParseIndirectObjectAt(m_pDocument, *pos, 0, nullptr); |
+ CPDF_Object* pObject = ParseIndirectObjectAt(m_pDocument, *pos, 0); |
if (!pObject) |
return FALSE; |
if (m_pDocument) { |
@@ -1198,8 +1196,7 @@ FX_BOOL CPDF_Parser::IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) { |
CPDF_Object* CPDF_Parser::ParseIndirectObject( |
CPDF_IndirectObjectHolder* pObjList, |
- FX_DWORD objnum, |
- PARSE_CONTEXT* pContext) { |
+ FX_DWORD objnum) { |
if (!IsValidObjectNumber(objnum)) |
return nullptr; |
@@ -1212,7 +1209,7 @@ CPDF_Object* CPDF_Parser::ParseIndirectObject( |
FX_FILESIZE pos = m_ObjectInfo[objnum].pos; |
if (pos <= 0) |
return nullptr; |
- return ParseIndirectObjectAt(pObjList, pos, objnum, pContext); |
+ return ParseIndirectObjectAt(pObjList, pos, objnum); |
} |
if (m_V5Type[objnum] != 2) |
return nullptr; |
@@ -1241,7 +1238,7 @@ CPDF_Object* CPDF_Parser::ParseIndirectObject( |
return nullptr; |
syntax.RestorePos(offset + it->second); |
- return syntax.GetObject(pObjList, 0, 0, pContext, true); |
+ return syntax.GetObject(pObjList, 0, 0, true); |
} |
CPDF_StreamAcc* CPDF_Parser::GetObjectStream(FX_DWORD objnum) { |
@@ -1249,8 +1246,10 @@ CPDF_StreamAcc* CPDF_Parser::GetObjectStream(FX_DWORD objnum) { |
if (it != m_ObjectStreamMap.end()) |
return it->second.get(); |
- const CPDF_Stream* pStream = ToStream( |
- m_pDocument ? m_pDocument->GetIndirectObject(objnum, nullptr) : nullptr); |
+ if (!m_pDocument) |
+ return nullptr; |
+ |
+ const CPDF_Stream* pStream = ToStream(m_pDocument->GetIndirectObject(objnum)); |
if (!pStream) |
return nullptr; |
@@ -1398,8 +1397,7 @@ void CPDF_Parser::GetIndirectBinary(FX_DWORD objnum, |
CPDF_Object* CPDF_Parser::ParseIndirectObjectAt( |
CPDF_IndirectObjectHolder* pObjList, |
FX_FILESIZE pos, |
- FX_DWORD objnum, |
- PARSE_CONTEXT* pContext) { |
+ FX_DWORD objnum) { |
FX_FILESIZE SavedPos = m_Syntax.SavePos(); |
m_Syntax.RestorePos(pos); |
bool bIsNumber; |
@@ -1425,8 +1423,7 @@ CPDF_Object* CPDF_Parser::ParseIndirectObjectAt( |
m_Syntax.RestorePos(SavedPos); |
return NULL; |
} |
- CPDF_Object* pObj = |
- m_Syntax.GetObject(pObjList, objnum, parser_gennum, pContext, true); |
+ CPDF_Object* pObj = m_Syntax.GetObject(pObjList, objnum, parser_gennum, true); |
m_Syntax.SavePos(); |
CFX_ByteString bsWord = m_Syntax.GetKeyword(); |
if (bsWord == "endobj") { |
@@ -1444,7 +1441,6 @@ CPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict( |
CPDF_IndirectObjectHolder* pObjList, |
FX_FILESIZE pos, |
FX_DWORD objnum, |
- PARSE_CONTEXT* pContext, |
FX_FILESIZE* pResultPos) { |
FX_FILESIZE SavedPos = m_Syntax.SavePos(); |
m_Syntax.RestorePos(pos); |
@@ -1469,8 +1465,7 @@ CPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict( |
m_Syntax.RestorePos(SavedPos); |
return NULL; |
} |
- CPDF_Object* pObj = |
- m_Syntax.GetObjectByStrict(pObjList, objnum, gennum, pContext); |
+ CPDF_Object* pObj = m_Syntax.GetObjectByStrict(pObjList, objnum, gennum); |
if (pResultPos) { |
*pResultPos = m_Syntax.m_Pos; |
} |
@@ -1483,7 +1478,7 @@ CPDF_Dictionary* CPDF_Parser::LoadTrailerV4() { |
return nullptr; |
std::unique_ptr<CPDF_Object, ReleaseDeleter<CPDF_Object>> pObj( |
- m_Syntax.GetObject(m_pDocument, 0, 0, nullptr, true)); |
+ m_Syntax.GetObject(m_pDocument, 0, 0, true)); |
if (!ToDictionary(pObj.get())) |
return nullptr; |
return pObj.release()->AsDictionary(); |
@@ -1536,7 +1531,7 @@ FX_BOOL CPDF_Parser::IsLinearizedFile(IFX_FileRead* pFileAccess, |
m_Syntax.RestorePos(SavedPos); |
return FALSE; |
} |
- m_pLinearized = m_Syntax.GetObject(nullptr, objnum, gennum, nullptr, true); |
+ m_pLinearized = m_Syntax.GetObject(nullptr, objnum, gennum, true); |
if (!m_pLinearized) { |
return FALSE; |
} |
@@ -2036,7 +2031,6 @@ CFX_ByteString CPDF_SyntaxParser::GetKeyword() { |
CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, |
FX_DWORD objnum, |
FX_DWORD gennum, |
- PARSE_CONTEXT* pContext, |
FX_BOOL bDecrypt) { |
CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); |
if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) { |
@@ -2083,8 +2077,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, |
} |
if (word == "[") { |
CPDF_Array* pArray = new CPDF_Array; |
- while (CPDF_Object* pObj = |
- GetObject(pObjList, objnum, gennum, nullptr, true)) { |
+ while (CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, true)) { |
pArray->Add(pObj); |
} |
return pArray; |
@@ -2094,9 +2087,6 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, |
PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1))); |
} |
if (word == "<<") { |
- if (pContext) |
- pContext->m_DictStart = SavedPos; |
- |
int32_t nKeys = 0; |
FX_FILESIZE dwSignValuePos = 0; |
std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( |
@@ -2125,7 +2115,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, |
if (key == "/Contents") |
dwSignValuePos = m_Pos; |
- CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, nullptr, true); |
+ CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, true); |
if (!pObj) |
continue; |
@@ -2138,11 +2128,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, |
if (IsSignatureDict(pDict.get()) && dwSignValuePos) { |
CFX_AutoRestorer<FX_FILESIZE> save_pos(&m_Pos); |
m_Pos = dwSignValuePos; |
- CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, nullptr, FALSE); |
- pDict->SetAt("Contents", pObj); |
- } |
- if (pContext) { |
- pContext->m_DictEnd = m_Pos; |
+ pDict->SetAt("Contents", GetObject(pObjList, objnum, gennum, false)); |
} |
FX_FILESIZE SavedPos = m_Pos; |
CFX_ByteString nextword = GetNextWord(nullptr); |
@@ -2150,7 +2136,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, |
m_Pos = SavedPos; |
return pDict.release(); |
} |
- return ReadStream(pDict.release(), pContext, objnum, gennum); |
+ return ReadStream(pDict.release(), objnum, gennum); |
} |
if (word == ">>") { |
m_Pos = SavedPos; |
@@ -2161,8 +2147,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, |
CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict( |
CPDF_IndirectObjectHolder* pObjList, |
FX_DWORD objnum, |
- FX_DWORD gennum, |
- PARSE_CONTEXT* pContext) { |
+ FX_DWORD gennum) { |
CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); |
if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) { |
return nullptr; |
@@ -2206,8 +2191,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict( |
if (word == "[") { |
std::unique_ptr<CPDF_Array, ReleaseDeleter<CPDF_Array>> pArray( |
new CPDF_Array); |
- while (CPDF_Object* pObj = |
- GetObject(pObjList, objnum, gennum, nullptr, true)) { |
+ while (CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, true)) { |
pArray->Add(pObj); |
} |
return m_WordBuffer[0] == ']' ? pArray.release() : nullptr; |
@@ -2217,9 +2201,6 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict( |
PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1))); |
} |
if (word == "<<") { |
- if (pContext) |
- pContext->m_DictStart = SavedPos; |
- |
std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( |
new CPDF_Dictionary); |
while (1) { |
@@ -2240,7 +2221,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict( |
key = PDF_NameDecode(key); |
std::unique_ptr<CPDF_Object, ReleaseDeleter<CPDF_Object>> obj( |
- GetObject(pObjList, objnum, gennum, nullptr, true)); |
+ GetObject(pObjList, objnum, gennum, true)); |
if (!obj) { |
uint8_t ch; |
while (GetNextChar(ch) && ch != 0x0A && ch != 0x0D) { |
@@ -2252,9 +2233,6 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict( |
obj.release()); |
} |
} |
- if (pContext) { |
- pContext->m_DictEnd = m_Pos; |
- } |
FX_FILESIZE SavedPos = m_Pos; |
CFX_ByteString nextword = GetNextWord(nullptr); |
if (nextword != "stream") { |
@@ -2262,7 +2240,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict( |
return pDict.release(); |
} |
- return ReadStream(pDict.release(), pContext, objnum, gennum); |
+ return ReadStream(pDict.release(), objnum, gennum); |
} |
if (word == ">>") { |
m_Pos = SavedPos; |
@@ -2284,7 +2262,6 @@ unsigned int CPDF_SyntaxParser::ReadEOLMarkers(FX_FILESIZE pos) { |
return markers; |
} |
CPDF_Stream* CPDF_SyntaxParser::ReadStream(CPDF_Dictionary* pDict, |
- PARSE_CONTEXT* pContext, |
FX_DWORD objnum, |
FX_DWORD gennum) { |
CPDF_Object* pLenObj = pDict->GetElement("Length"); |
@@ -2299,10 +2276,6 @@ CPDF_Stream* CPDF_SyntaxParser::ReadStream(CPDF_Dictionary* pDict, |
// Locate the start of stream. |
ToNextLine(); |
FX_FILESIZE streamStartPos = m_Pos; |
- if (pContext) { |
- pContext->m_DataStart = streamStartPos; |
- } |
- |
const CFX_ByteStringC kEndStreamStr("endstream"); |
const CFX_ByteStringC kEndObjStr("endobj"); |
CPDF_CryptoHandler* pCryptoHandler = |
@@ -2412,9 +2385,6 @@ CPDF_Stream* CPDF_SyntaxParser::ReadStream(CPDF_Dictionary* pDict, |
} |
} |
CPDF_Stream* pStream = new CPDF_Stream(pData, len, pDict); |
- if (pContext) { |
- pContext->m_DataEnd = pContext->m_DataStart + len; |
- } |
streamStartPos = m_Pos; |
FXSYS_memset(m_WordBuffer, 0, kEndObjStr.GetLength() + 1); |
GetNextWordInternal(nullptr); |
@@ -3008,7 +2978,7 @@ FX_BOOL CPDF_DataAvail::IsObjectsAvail( |
} else if (!pdfium::ContainsKey(m_ObjectSet, dwNum)) { |
m_ObjectSet.insert(dwNum); |
CPDF_Object* pReferred = |
- m_pDocument->GetIndirectObject(pRef->GetRefObjNum(), nullptr); |
+ m_pDocument->GetIndirectObject(pRef->GetRefObjNum()); |
if (pReferred) { |
new_obj_array.Add(pReferred); |
} |
@@ -3207,13 +3177,11 @@ CPDF_Object* CPDF_DataAvail::GetObject(FX_DWORD objnum, |
return nullptr; |
} |
if (pParser) { |
- pRet = pParser->ParseIndirectObject(NULL, objnum, NULL); |
+ pRet = pParser->ParseIndirectObject(nullptr, objnum); |
} |
- |
if (!pRet && pExistInFile) { |
*pExistInFile = FALSE; |
} |
- |
return pRet; |
} |
@@ -3590,7 +3558,7 @@ CPDF_Object* CPDF_DataAvail::ParseIndirectObjectAt( |
return nullptr; |
} |
CPDF_Object* pObj = |
- m_syntaxParser.GetObject(pObjList, parser_objnum, gennum, nullptr, true); |
+ m_syntaxParser.GetObject(pObjList, parser_objnum, gennum, true); |
m_syntaxParser.RestorePos(SavedPos); |
return pObj; |
} |
@@ -3708,7 +3676,7 @@ int32_t CPDF_DataAvail::CheckCrossRefStream(IFX_DownloadHints* pHints, |
return -1; |
FX_DWORD objNum = FXSYS_atoi(objnum); |
- CPDF_Object* pObj = m_parser.ParseIndirectObjectAt(NULL, 0, objNum, NULL); |
+ CPDF_Object* pObj = m_parser.ParseIndirectObjectAt(nullptr, 0, objNum); |
if (!pObj) { |
m_Pos += m_parser.m_Syntax.SavePos(); |
return 0; |
@@ -3938,7 +3906,7 @@ FX_BOOL CPDF_DataAvail::CheckTrailer(IFX_DownloadHints* pHints) { |
ScopedFileStream file(FX_CreateMemoryStream(pBuf, (size_t)iSize, FALSE)); |
m_syntaxParser.InitParser(file.get(), 0); |
std::unique_ptr<CPDF_Object, ReleaseDeleter<CPDF_Object>> pTrailer( |
- m_syntaxParser.GetObject(nullptr, 0, 0, nullptr, true)); |
+ m_syntaxParser.GetObject(nullptr, 0, 0, true)); |
if (!pTrailer) { |
m_Pos += m_syntaxParser.SavePos(); |
pHints->AddSegment(m_Pos, iTrailerSize); |