From d2608a87173f00cb80830d56b52eeb588055ba3a Mon Sep 17 00:00:00 2001 From: Artem Strygin Date: Fri, 1 Sep 2017 18:52:30 +0300 Subject: Move Parsing of indirect object logic into CPDF_SyntaxParser. Change-Id: I5473d6db3e6fc247d52a83b34424958dc20387f4 Reviewed-on: https://pdfium-review.googlesource.com/12150 Reviewed-by: dsinclair Commit-Queue: Art Snake --- core/fpdfapi/parser/cpdf_syntax_parser.cpp | 43 ++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'core/fpdfapi/parser/cpdf_syntax_parser.cpp') diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.cpp b/core/fpdfapi/parser/cpdf_syntax_parser.cpp index e3a23cf462..73932494c0 100644 --- a/core/fpdfapi/parser/cpdf_syntax_parser.cpp +++ b/core/fpdfapi/parser/cpdf_syntax_parser.cpp @@ -529,6 +529,49 @@ std::unique_ptr CPDF_SyntaxParser::GetObjectForStrict( return result; } +std::unique_ptr CPDF_SyntaxParser::GetIndirectObject( + CPDF_IndirectObjectHolder* pObjList, + uint32_t objnum, + bool bDecrypt, + ParseType parse_type) { + const CPDF_ReadValidator::Session read_session(GetValidator().Get()); + const FX_FILESIZE saved_pos = GetPos(); + bool is_number = false; + CFX_ByteString word = GetNextWord(&is_number); + if (!is_number || word.IsEmpty()) { + SetPos(saved_pos); + return nullptr; + } + + uint32_t parser_objnum = FXSYS_atoui(word.c_str()); + if (objnum && parser_objnum != objnum) { + SetPos(saved_pos); + return nullptr; + } + + word = GetNextWord(&is_number); + if (!is_number || word.IsEmpty()) { + SetPos(saved_pos); + return nullptr; + } + + const uint32_t parser_gennum = FXSYS_atoui(word.c_str()); + if (GetKeyword() != "obj") { + SetPos(saved_pos); + return nullptr; + } + + std::unique_ptr pObj = + GetObjectInternal(pObjList, objnum, parser_gennum, bDecrypt, parse_type); + if (pObj) { + if (!objnum) + pObj->m_ObjNum = parser_objnum; + pObj->m_GenNum = parser_gennum; + } + + return GetValidator()->has_read_problems() ? nullptr : std::move(pObj); +} + unsigned int CPDF_SyntaxParser::ReadEOLMarkers(FX_FILESIZE pos) { unsigned char byte1 = 0; unsigned char byte2 = 0; -- cgit v1.2.3