Rework of CPDF_DataAvail::CheckHintTables.
Move HintTables parsing logic into CPDF_HintTables.
Change-Id: I9748179fe9fc3ac44f88c19c347e30c0e7e3ac67
Reviewed-on: https://pdfium-review.googlesource.com/38771
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Art Snake <art-snake@yandex-team.ru>
diff --git a/core/fpdfapi/parser/cpdf_data_avail.cpp b/core/fpdfapi/parser/cpdf_data_avail.cpp
index 41d410a..904b0ad 100644
--- a/core/fpdfapi/parser/cpdf_data_avail.cpp
+++ b/core/fpdfapi/parser/cpdf_data_avail.cpp
@@ -437,29 +437,16 @@
}
bool CPDF_DataAvail::CheckHintTables() {
- if (m_pLinearized->GetPageCount() <= 1) {
- m_docStatus = PDF_DATAAVAIL_DONE;
+ const CPDF_ReadValidator::Session read_session(GetValidator().Get());
+ m_pHintTables =
+ CPDF_HintTables::Parse(GetSyntaxParser(), m_pLinearized.get());
+
+ if (GetValidator()->read_error()) {
+ m_docStatus = PDF_DATAAVAIL_ERROR;
return true;
}
- if (!m_pLinearized->HasHintTable()) {
- m_docStatus = PDF_DATAAVAIL_ERROR;
+ if (GetValidator()->has_unavailable_data())
return false;
- }
-
- const FX_FILESIZE szHintStart = m_pLinearized->GetHintStart();
- const uint32_t szHintLength = m_pLinearized->GetHintLength();
-
- if (!GetValidator()->CheckDataRangeAndRequestIfUnavailable(szHintStart,
- szHintLength))
- return false;
-
- auto pHintTables = pdfium::MakeUnique<CPDF_HintTables>(GetValidator().Get(),
- m_pLinearized.get());
- std::unique_ptr<CPDF_Object> pHintStream =
- ParseIndirectObjectAt(szHintStart, 0);
- CPDF_Stream* pStream = ToStream(pHintStream.get());
- if (pStream && pHintTables->LoadHintStream(pStream))
- m_pHintTables = std::move(pHintTables);
m_docStatus = PDF_DATAAVAIL_DONE;
return true;
diff --git a/core/fpdfapi/parser/cpdf_hint_tables.cpp b/core/fpdfapi/parser/cpdf_hint_tables.cpp
index 71fb6e2..43c3138 100644
--- a/core/fpdfapi/parser/cpdf_hint_tables.cpp
+++ b/core/fpdfapi/parser/cpdf_hint_tables.cpp
@@ -16,6 +16,7 @@
#include "core/fpdfapi/parser/cpdf_read_validator.h"
#include "core/fpdfapi/parser/cpdf_stream.h"
#include "core/fpdfapi/parser/cpdf_stream_acc.h"
+#include "core/fpdfapi/parser/cpdf_syntax_parser.h"
#include "core/fxcrt/cfx_bitstream.h"
#include "core/fxcrt/fx_safe_types.h"
#include "third_party/base/numerics/safe_conversions.h"
@@ -40,6 +41,39 @@
CPDF_HintTables::PageInfo::PageInfo() = default;
CPDF_HintTables::PageInfo::~PageInfo() = default;
+// static
+std::unique_ptr<CPDF_HintTables> CPDF_HintTables::Parse(
+ CPDF_SyntaxParser* parser,
+ CPDF_LinearizedHeader* pLinearized) {
+ ASSERT(parser);
+ if (!pLinearized || pLinearized->GetPageCount() <= 1 ||
+ !pLinearized->HasHintTable()) {
+ return nullptr;
+ }
+
+ const FX_FILESIZE szHintStart = pLinearized->GetHintStart();
+ const uint32_t szHintLength = pLinearized->GetHintLength();
+
+ if (!parser->GetValidator()->CheckDataRangeAndRequestIfUnavailable(
+ szHintStart, szHintLength)) {
+ return nullptr;
+ }
+
+ parser->SetPos(szHintStart);
+ std::unique_ptr<CPDF_Stream> hints_stream = ToStream(
+ parser->GetIndirectObject(nullptr, CPDF_SyntaxParser::ParseType::kLoose));
+
+ if (!hints_stream)
+ return nullptr;
+
+ auto pHintTables = pdfium::MakeUnique<CPDF_HintTables>(
+ parser->GetValidator().Get(), pLinearized);
+ if (!pHintTables->LoadHintStream(hints_stream.get()))
+ return nullptr;
+
+ return pHintTables;
+}
+
CPDF_HintTables::CPDF_HintTables(CPDF_ReadValidator* pValidator,
CPDF_LinearizedHeader* pLinearized)
: m_pValidator(pValidator),
diff --git a/core/fpdfapi/parser/cpdf_hint_tables.h b/core/fpdfapi/parser/cpdf_hint_tables.h
index 20ba9be..6b6a589 100644
--- a/core/fpdfapi/parser/cpdf_hint_tables.h
+++ b/core/fpdfapi/parser/cpdf_hint_tables.h
@@ -7,6 +7,7 @@
#ifndef CORE_FPDFAPI_PARSER_CPDF_HINT_TABLES_H_
#define CORE_FPDFAPI_PARSER_CPDF_HINT_TABLES_H_
+#include <memory>
#include <vector>
#include "core/fpdfapi/parser/cpdf_data_avail.h"
@@ -15,8 +16,9 @@
class CFX_BitStream;
class CPDF_LinearizedHeader;
-class CPDF_Stream;
class CPDF_ReadValidator;
+class CPDF_Stream;
+class CPDF_SyntaxParser;
class CPDF_HintTables {
public:
@@ -67,6 +69,10 @@
PageInfo& operator=(const PageInfo&) = delete;
};
+ static std::unique_ptr<CPDF_HintTables> Parse(
+ CPDF_SyntaxParser* parser,
+ CPDF_LinearizedHeader* pLinearized);
+
CPDF_HintTables(CPDF_ReadValidator* pValidator,
CPDF_LinearizedHeader* pLinearized);
virtual ~CPDF_HintTables();