summaryrefslogtreecommitdiff
path: root/core/fpdfapi/parser/cpdf_parser.cpp
diff options
context:
space:
mode:
authorart-snake <art-snake@yandex-team.ru>2016-11-07 08:42:04 -0800
committerCommit bot <commit-bot@chromium.org>2016-11-07 08:42:04 -0800
commit240dec52b2e6502e7deb27a3535af3b1a3e23428 (patch)
treeead5a550c7988ac3291452e524296634423f3012 /core/fpdfapi/parser/cpdf_parser.cpp
parenta94fc11866adb1b9ca4a4e1afb4fb574ed472e07 (diff)
downloadpdfium-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.cpp46
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;
}