7#include "core/fpdfapi/parser/cpdf_linearized_header.h"
13#include "core/fpdfapi/parser/cpdf_array.h"
14#include "core/fpdfapi/parser/cpdf_dictionary.h"
15#include "core/fpdfapi/parser/cpdf_number.h"
16#include "core/fpdfapi/parser/cpdf_parser.h"
17#include "core/fpdfapi/parser/cpdf_syntax_parser.h"
18#include "core/fxcrt/fx_safe_types.h"
19#include "third_party/base/check.h"
20#include "third_party/base/memory/ptr_util.h"
25constexpr size_t kMaxInt =
static_cast<size_t>(std::numeric_limits<
int>::max());
28bool IsValidNumericDictionaryValue(
const CPDF_Dictionary* pDict,
29 const ByteString& key,
31 bool must_exist =
true) {
34 RetainPtr<
const CPDF_Number> pNum = pDict->GetNumberFor(key);
35 if (!pNum || !pNum->IsInteger())
37 const int raw_value = pNum->GetInteger();
38 if (!pdfium::base::IsValueInRangeForNumericType<T>(raw_value))
40 return static_cast<T>(raw_value) >= min_value;
63 const auto pDict = ToDictionary(
66 if (!pDict || !pDict->KeyExist(
"Linearized") ||
67 !IsValidNumericDictionaryValue<
FX_FILESIZE>(pDict.Get(),
"L", 1) ||
68 !IsValidNumericDictionaryValue<uint32_t>(pDict.Get(),
"P", 0,
false) ||
69 !IsValidNumericDictionaryValue<
FX_FILESIZE>(pDict.Get(),
"T", 1) ||
70 !IsValidNumericDictionaryValue<uint32_t>(pDict.Get(),
"N", 1) ||
71 !IsValidNumericDictionaryValue<
FX_FILESIZE>(pDict.Get(),
"E", 1) ||
72 !IsValidNumericDictionaryValue<uint32_t>(pDict.Get(),
"O", 1)) {
80 auto result = pdfium::WrapUnique(
97 m_szLastXRefOffset(szLastXRefOffset) {
98 RetainPtr<
const CPDF_Array> pHintStreamRange = pDict->GetArrayFor(
"H");
99 const size_t nHintStreamSize =
100 pHintStreamRange ? pHintStreamRange->size() : 0;
101 if (nHintStreamSize == 2 || nHintStreamSize == 4) {
102 m_szHintStart =
std::max(pHintStreamRange->GetIntegerAt(0), 0);
103 const FX_SAFE_UINT32 safe_hint_length = pHintStreamRange->GetIntegerAt(1);
104 if (safe_hint_length.IsValid())
105 m_HintLength = safe_hint_length.ValueOrDie();
bool KeyExist(const ByteString &key) const
int GetIntegerFor(const ByteString &key) const
static constexpr uint32_t kMaxObjectNumber
RetainPtr< CPDF_Object > GetIndirectObject(CPDF_IndirectObjectHolder *pObjList, ParseType parse_type)
FX_FILESIZE GetPos() const
FX_FILESIZE GetDocumentSize() const
void SetPos(FX_FILESIZE pos)