From aafdc153a2b7609968b315ca6c6900717f6d6c36 Mon Sep 17 00:00:00 2001 From: Artem Strygin Date: Tue, 3 Oct 2017 17:33:19 +0300 Subject: Unify CPDF_HintsTable. Break relationship from CPDF_DataAvail for CPDF_HintsTable. Change-Id: If3e6d4910dd368742f095c05adb122ab08c0d804 Reviewed-on: https://pdfium-review.googlesource.com/15270 Commit-Queue: Art Snake Reviewed-by: dsinclair --- core/fpdfapi/parser/cpdf_read_validator.cpp | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) (limited to 'core/fpdfapi/parser/cpdf_read_validator.cpp') diff --git a/core/fpdfapi/parser/cpdf_read_validator.cpp b/core/fpdfapi/parser/cpdf_read_validator.cpp index 6c311f7571..2363f851ec 100644 --- a/core/fpdfapi/parser/cpdf_read_validator.cpp +++ b/core/fpdfapi/parser/cpdf_read_validator.cpp @@ -6,11 +6,12 @@ #include +#include "core/fpdfapi/cpdf_modulemgr.h" #include "third_party/base/logging.h" namespace { -constexpr FX_FILESIZE kAlignBlockValue = 512; +constexpr FX_FILESIZE kAlignBlockValue = CPDF_ModuleMgr::kFileBufSize; FX_FILESIZE AlignDown(FX_FILESIZE offset) { return offset > 0 ? (offset - offset % kAlignBlockValue) : 0; @@ -64,8 +65,10 @@ bool CPDF_ReadValidator::ReadBlock(void* buffer, if (!end_offset.IsValid() || end_offset.ValueOrDie() > file_size_) return false; - if (!CheckDataRangeAndRequestIfUnavailable(offset, size)) + if (!IsDataRangeAvailable(offset, size)) { + ScheduleDownload(offset, size); return false; + } if (file_read_->ReadBlock(buffer, offset, size)) return true; @@ -122,10 +125,27 @@ bool CPDF_ReadValidator::IsWholeFileAvailable() { bool CPDF_ReadValidator::CheckDataRangeAndRequestIfUnavailable( FX_FILESIZE offset, size_t size) { - if (IsDataRangeAvailable(offset, size)) + FX_SAFE_FILESIZE end_segment_offset = offset; + end_segment_offset += size; + // Increase checked range to allow CPDF_SyntaxParser read whole buffer. + end_segment_offset += CPDF_ModuleMgr::kFileBufSize; + if (!end_segment_offset.IsValid()) { + NOTREACHED(); + return false; + } + end_segment_offset = std::min( + file_size_, static_cast(end_segment_offset.ValueOrDie())); + FX_SAFE_SIZE_T segment_size = end_segment_offset; + segment_size -= offset; + if (!segment_size.IsValid()) { + NOTREACHED(); + return false; + } + + if (IsDataRangeAvailable(offset, segment_size.ValueOrDie())) return true; - ScheduleDownload(offset, size); + ScheduleDownload(offset, segment_size.ValueOrDie()); return false; } -- cgit v1.2.3