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 5dfcc82787664b567f7066ece623db2ac72ba890..819598976c023da9c21f7f1bcd6915f3d0a626ae 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) |
{ |
@@ -39,6 +38,7 @@ static int _CompareFileSize(const void* p1, const void* p2) |
} |
return 0; |
} |
+ |
CPDF_Parser::CPDF_Parser() |
{ |
m_pDocument = NULL; |
@@ -1217,7 +1217,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 --; |
@@ -1396,7 +1396,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")) { |
@@ -1437,7 +1437,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; |
} |
@@ -1676,6 +1676,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; |
@@ -2049,9 +2053,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; |
@@ -2136,7 +2141,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; |
} |
@@ -2188,7 +2193,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; |
} |
@@ -2203,7 +2208,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; |
} |
@@ -2238,10 +2243,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; |
@@ -2318,7 +2323,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; |
@@ -2364,7 +2369,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(); |