summaryrefslogtreecommitdiff
path: root/core/fpdfapi/parser/cpdf_syntax_parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/fpdfapi/parser/cpdf_syntax_parser.cpp')
-rw-r--r--core/fpdfapi/parser/cpdf_syntax_parser.cpp43
1 files changed, 43 insertions, 0 deletions
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_Object> CPDF_SyntaxParser::GetObjectForStrict(
return result;
}
+std::unique_ptr<CPDF_Object> 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<CPDF_Object> 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;