| 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 ad97d1f3696de7929a92287c5e98990606791175..236ecaa837783d0dad71cbf83c0bcc2e6598c99f 100644
|
| --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| @@ -36,6 +36,20 @@ struct SearchTagRecord {
|
| FX_DWORD m_Offset;
|
| };
|
|
|
| +template <typename T>
|
| +class ScopedSetInsertion {
|
| + public:
|
| + ScopedSetInsertion(std::set<T>* org_set, T elem)
|
| + : m_Set(org_set), m_Entry(elem) {
|
| + m_Set->insert(m_Entry);
|
| + }
|
| + ~ScopedSetInsertion() { m_Set->erase(m_Entry); }
|
| +
|
| + private:
|
| + std::set<T>* const m_Set;
|
| + const T m_Entry;
|
| +};
|
| +
|
| int CompareFileSize(const void* p1, const void* p2) {
|
| return *(FX_FILESIZE*)p1 - *(FX_FILESIZE*)p2;
|
| }
|
| @@ -1193,6 +1207,11 @@ CPDF_Object* CPDF_Parser::ParseIndirectObject(CPDF_IndirectObjects* pObjList,
|
| if (!IsValidObjectNumber(objnum))
|
| return nullptr;
|
|
|
| + // Prevent circular parsing the same object.
|
| + if (pdfium::ContainsKey(m_ParsingObjNums, objnum))
|
| + return nullptr;
|
| + ScopedSetInsertion<FX_DWORD> local_insert(&m_ParsingObjNums, objnum);
|
| +
|
| if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) {
|
| FX_FILESIZE pos = m_ObjectInfo[objnum].pos;
|
| if (pos <= 0)
|
|
|