diff options
author | art-snake <art-snake@yandex-team.ru> | 2016-11-07 08:42:04 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-11-07 08:42:04 -0800 |
commit | 240dec52b2e6502e7deb27a3535af3b1a3e23428 (patch) | |
tree | ead5a550c7988ac3291452e524296634423f3012 /core/fpdfapi/parser/cpdf_parser.cpp | |
parent | a94fc11866adb1b9ca4a4e1afb4fb574ed472e07 (diff) | |
download | pdfium-240dec52b2e6502e7deb27a3535af3b1a3e23428.tar.xz |
Reland of Unify some code
Unify some code
Move parsing of linearized header into separate CPDF_Linearized class.
Original review:
https://codereview.chromium.org/2466023002/
Revert review:
https://codereview.chromium.org/2474283005/
Revert reason was:
Breaking the chrome roll.
See https://build.chromium.org/p/tryserver.chromium.linux/builders/linux_chromium_rel_ng/builds/331856
___
Added Fix for fuzzers.
Review-Url: https://codereview.chromium.org/2477213003
Diffstat (limited to 'core/fpdfapi/parser/cpdf_parser.cpp')
-rw-r--r-- | core/fpdfapi/parser/cpdf_parser.cpp | 46 |
1 files changed, 13 insertions, 33 deletions
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp index c8c07bd0b7..044d12d6ef 100644 --- a/core/fpdfapi/parser/cpdf_parser.cpp +++ b/core/fpdfapi/parser/cpdf_parser.cpp @@ -12,6 +12,7 @@ #include "core/fpdfapi/parser/cpdf_crypto_handler.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_linearized.h" #include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfapi/parser/cpdf_reference.h" #include "core/fpdfapi/parser/cpdf_security_handler.h" @@ -54,8 +55,6 @@ CPDF_Parser::CPDF_Parser() m_pTrailer(nullptr), m_pEncryptDict(nullptr), m_bVersionUpdated(false), - m_pLinearized(nullptr), - m_dwFirstPageNo(0), m_dwXrefStartObjNum(0) { m_pSyntax.reset(new CPDF_SyntaxParser); } @@ -72,8 +71,6 @@ CPDF_Parser::~CPDF_Parser() { for (CPDF_Dictionary* trailer : m_Trailers) delete trailer; - - delete m_pLinearized; } uint32_t CPDF_Parser::GetLastObjNum() const { @@ -1402,6 +1399,10 @@ CPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict( return pObj; } +uint32_t CPDF_Parser::GetFirstPageNo() const { + return m_pLinearized ? m_pLinearized->GetFirstPageNo() : 0; +} + CPDF_Dictionary* CPDF_Parser::LoadTrailerV4() { if (m_pSyntax->GetKeyword() != "trailer") return nullptr; @@ -1448,35 +1449,14 @@ bool CPDF_Parser::IsLinearizedFile(IFX_SeekableReadStream* pFileAccess, return false; } - m_pLinearized = m_pSyntax->GetObject(nullptr, objnum, gennum, true); + m_pLinearized = CPDF_Linearized::CreateForObject( + pdfium::WrapUnique(m_pSyntax->GetObject(nullptr, objnum, gennum, true))); if (!m_pLinearized) return false; - - CPDF_Dictionary* pDict = m_pLinearized->GetDict(); - if (pDict && pDict->GetObjectFor("Linearized")) { - m_pSyntax->GetNextWord(nullptr); - - CPDF_Object* pLen = pDict->GetObjectFor("L"); - if (!pLen) { - delete m_pLinearized; - m_pLinearized = nullptr; - return false; - } - - if (pLen->GetInteger() != (int)pFileAccess->GetSize()) - return false; - - if (CPDF_Number* pNo = ToNumber(pDict->GetObjectFor("P"))) - m_dwFirstPageNo = pNo->GetInteger(); - - if (CPDF_Number* pTable = ToNumber(pDict->GetObjectFor("T"))) - m_LastXRefOffset = pTable->GetInteger(); - - return true; - } - delete m_pLinearized; - m_pLinearized = nullptr; - return false; + m_LastXRefOffset = m_pLinearized->GetLastXRefOffset(); + // Move parser onto first page xref table start. + m_pSyntax->GetNextWord(nullptr); + return true; } CPDF_Parser::Error CPDF_Parser::StartLinearizedParse( @@ -1525,7 +1505,7 @@ CPDF_Parser::Error CPDF_Parser::StartLinearizedParse( if (eRet != SUCCESS) return eRet; - m_pDocument->LoadLinearizedDoc(m_pLinearized->GetDict()); + m_pDocument->LoadLinearizedDoc(m_pLinearized.get()); if (!m_pDocument->GetRoot() || m_pDocument->GetPageCount() == 0) { if (bXRefRebuilt) return FORMAT_ERROR; @@ -1538,7 +1518,7 @@ CPDF_Parser::Error CPDF_Parser::StartLinearizedParse( if (eRet != SUCCESS) return eRet; - m_pDocument->LoadLinearizedDoc(m_pLinearized->GetDict()); + m_pDocument->LoadLinearizedDoc(m_pLinearized.get()); if (!m_pDocument->GetRoot()) return FORMAT_ERROR; } |