diff options
Diffstat (limited to 'core/fpdfapi/parser/cpdf_syntax_parser.cpp')
-rw-r--r-- | core/fpdfapi/parser/cpdf_syntax_parser.cpp | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.cpp b/core/fpdfapi/parser/cpdf_syntax_parser.cpp index 5fa3372d50..979ccad712 100644 --- a/core/fpdfapi/parser/cpdf_syntax_parser.cpp +++ b/core/fpdfapi/parser/cpdf_syntax_parser.cpp @@ -19,6 +19,7 @@ #include "core/fpdfapi/parser/cpdf_name.h" #include "core/fpdfapi/parser/cpdf_null.h" #include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_read_validator.h" #include "core/fpdfapi/parser/cpdf_reference.h" #include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fpdfapi/parser/cpdf_string.h" @@ -358,8 +359,11 @@ void CPDF_SyntaxParser::ToNextWord() { } CFX_ByteString CPDF_SyntaxParser::GetNextWord(bool* bIsNumber) { + const CPDF_ReadValidator::Session read_session(GetValidator().Get()); GetNextWordInternal(bIsNumber); - return CFX_ByteString((const char*)m_WordBuffer, m_WordSize); + return GetValidator()->has_read_problems() + ? CFX_ByteString() + : CFX_ByteString((const char*)m_WordBuffer, m_WordSize); } CFX_ByteString CPDF_SyntaxParser::GetKeyword() { @@ -371,6 +375,18 @@ std::unique_ptr<CPDF_Object> CPDF_SyntaxParser::GetObject( uint32_t objnum, uint32_t gennum, bool bDecrypt) { + const CPDF_ReadValidator::Session read_session(GetValidator().Get()); + auto result = GetObjectInternal(pObjList, objnum, gennum, bDecrypt); + if (GetValidator()->has_read_problems()) + return nullptr; + return result; +} + +std::unique_ptr<CPDF_Object> CPDF_SyntaxParser::GetObjectInternal( + CPDF_IndirectObjectHolder* pObjList, + uint32_t objnum, + uint32_t gennum, + bool bDecrypt) { CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) return nullptr; @@ -492,6 +508,17 @@ std::unique_ptr<CPDF_Object> CPDF_SyntaxParser::GetObjectForStrict( CPDF_IndirectObjectHolder* pObjList, uint32_t objnum, uint32_t gennum) { + const CPDF_ReadValidator::Session read_session(GetValidator().Get()); + auto result = GetObjectForStrictInternal(pObjList, objnum, gennum); + if (GetValidator()->has_read_problems()) + return nullptr; + return result; +} + +std::unique_ptr<CPDF_Object> CPDF_SyntaxParser::GetObjectForStrictInternal( + CPDF_IndirectObjectHolder* pObjList, + uint32_t objnum, + uint32_t gennum) { CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) return nullptr; @@ -765,16 +792,25 @@ std::unique_ptr<CPDF_Stream> CPDF_SyntaxParser::ReadStream( void CPDF_SyntaxParser::InitParser( const CFX_RetainPtr<IFX_SeekableReadStream>& pFileAccess, uint32_t HeaderOffset) { - FX_Free(m_pFileBuf); + ASSERT(pFileAccess); + return InitParserWithValidator( + pdfium::MakeRetain<CPDF_ReadValidator>(pFileAccess, nullptr), + HeaderOffset); +} +void CPDF_SyntaxParser::InitParserWithValidator( + const CFX_RetainPtr<CPDF_ReadValidator>& validator, + uint32_t HeaderOffset) { + ASSERT(validator); + FX_Free(m_pFileBuf); m_pFileBuf = FX_Alloc(uint8_t, m_BufSize); m_HeaderOffset = HeaderOffset; - m_FileLen = pFileAccess->GetSize(); + m_FileLen = validator->GetSize(); m_Pos = 0; - m_pFileAccess = pFileAccess; + m_pFileAccess = validator; m_BufOffset = 0; - pFileAccess->ReadBlock(m_pFileBuf, 0, - std::min(m_BufSize, static_cast<uint32_t>(m_FileLen))); + validator->ReadBlock(m_pFileBuf, 0, + std::min(m_BufSize, static_cast<uint32_t>(m_FileLen))); } uint32_t CPDF_SyntaxParser::GetDirectNum() { |