| 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 b759cc8a702a6183257ad912412e60b2ec73ec5a..f50d5eeb13805c648545cfc101a6d293936e345f 100644
|
| --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| @@ -12,7 +12,6 @@
|
| #include <utility>
|
| #include <vector>
|
|
|
| -#define _PARSER_OBJECT_LEVLE_ 64
|
| extern const FX_LPCSTR _PDF_CharType;
|
| FX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict)
|
| {
|
| @@ -43,6 +42,7 @@ static int _CompareFileSize(const void* p1, const void* p2)
|
| }
|
| return 0;
|
| }
|
| +
|
| CPDF_Parser::CPDF_Parser()
|
| {
|
| m_pDocument = NULL;
|
| @@ -1221,7 +1221,7 @@ CPDF_Object* CPDF_Parser::ParseIndirectObject(CPDF_IndirectObjects* pObjList, FX
|
| FX_DWORD thisoff = syntax.GetDirectNum();
|
| if (thisnum == objnum) {
|
| syntax.RestorePos(offset + thisoff);
|
| - pRet = syntax.GetObject(pObjList, 0, 0, 0, pContext);
|
| + pRet = syntax.GetObject(pObjList, 0, 0, pContext);
|
| break;
|
| }
|
| n --;
|
| @@ -1400,7 +1400,7 @@ CPDF_Object* CPDF_Parser::ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList,
|
| m_Syntax.RestorePos(SavedPos);
|
| return NULL;
|
| }
|
| - CPDF_Object* pObj = m_Syntax.GetObject(pObjList, objnum, parser_gennum, 0, pContext);
|
| + CPDF_Object* pObj = m_Syntax.GetObject(pObjList, objnum, parser_gennum, pContext);
|
| FX_FILESIZE endOffset = m_Syntax.SavePos();
|
| CFX_ByteString bsWord = m_Syntax.GetKeyword();
|
| if (bsWord == FX_BSTRC("endobj")) {
|
| @@ -1441,7 +1441,7 @@ CPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict(CPDF_IndirectObjects* pO
|
| m_Syntax.RestorePos(SavedPos);
|
| return NULL;
|
| }
|
| - CPDF_Object* pObj = m_Syntax.GetObjectByStrict(pObjList, objnum, gennum, 0, pContext);
|
| + CPDF_Object* pObj = m_Syntax.GetObjectByStrict(pObjList, objnum, gennum, pContext);
|
| if (pResultPos) {
|
| *pResultPos = m_Syntax.m_Pos;
|
| }
|
| @@ -1680,6 +1680,10 @@ FX_DWORD CPDF_Parser::LoadLinearizedMainXRefTable()
|
| m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum;
|
| return PDFPARSE_ERROR_SUCCESS;
|
| }
|
| +
|
| +// static
|
| +int CPDF_SyntaxParser::s_CurrentRecursionDepth = 0;
|
| +
|
| CPDF_SyntaxParser::CPDF_SyntaxParser()
|
| {
|
| m_pFileAccess = NULL;
|
| @@ -2053,9 +2057,10 @@ CFX_ByteString CPDF_SyntaxParser::GetKeyword()
|
| GetNextWord();
|
| return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize);
|
| }
|
| -CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, FX_INT32 level, PARSE_CONTEXT* pContext, FX_BOOL bDecrypt)
|
| +CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, PARSE_CONTEXT* pContext, FX_BOOL bDecrypt)
|
| {
|
| - if (level > _PARSER_OBJECT_LEVLE_) {
|
| + CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth);
|
| + if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) {
|
| return NULL;
|
| }
|
| FX_FILESIZE SavedPos = m_Pos;
|
| @@ -2140,7 +2145,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, FX_DWO
|
| }
|
| CPDF_Array* pArray = CPDF_Array::Create();
|
| while (1) {
|
| - CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);
|
| + CPDF_Object* pObj = GetObject(pObjList, objnum, gennum);
|
| if (pObj == NULL) {
|
| return pArray;
|
| }
|
| @@ -2192,7 +2197,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, FX_DWO
|
| if (key == FX_BSTRC("/Contents")) {
|
| dwSignValuePos = m_Pos;
|
| }
|
| - CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);
|
| + CPDF_Object* pObj = GetObject(pObjList, objnum, gennum);
|
| if (pObj == NULL) {
|
| continue;
|
| }
|
| @@ -2207,7 +2212,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, FX_DWO
|
| if (IsSignatureDict(pDict)) {
|
| FX_FILESIZE dwSavePos = m_Pos;
|
| m_Pos = dwSignValuePos;
|
| - CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1, NULL, FALSE);
|
| + CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, NULL, FALSE);
|
| pDict->SetAt(FX_BSTRC("Contents"), pObj);
|
| m_Pos = dwSavePos;
|
| }
|
| @@ -2242,10 +2247,10 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, FX_DWO
|
| }
|
| return NULL;
|
| }
|
| -CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum,
|
| - FX_INT32 level, struct PARSE_CONTEXT* pContext)
|
| +CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, struct PARSE_CONTEXT* pContext)
|
| {
|
| - if (level > _PARSER_OBJECT_LEVLE_) {
|
| + CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth);
|
| + if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) {
|
| return NULL;
|
| }
|
| FX_FILESIZE SavedPos = m_Pos;
|
| @@ -2322,7 +2327,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(CPDF_IndirectObjects* pObjList
|
| }
|
| CPDF_Array* pArray = CPDF_Array::Create();
|
| while (1) {
|
| - CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);
|
| + CPDF_Object* pObj = GetObject(pObjList, objnum, gennum);
|
| if (pObj == NULL) {
|
| if (m_WordBuffer[0] == ']') {
|
| return pArray;
|
| @@ -2368,7 +2373,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(CPDF_IndirectObjects* pObjList
|
| continue;
|
| }
|
| key = PDF_NameDecode(key);
|
| - CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);
|
| + CPDF_Object* pObj = GetObject(pObjList, objnum, gennum);
|
| if (pObj == NULL) {
|
| if (pDict)
|
| pDict->Release();
|
|
|