summaryrefslogtreecommitdiff
path: root/core/fpdfapi/parser/cpdf_read_validator.cpp
diff options
context:
space:
mode:
authorArtem Strygin <art-snake@yandex-team.ru>2017-10-03 17:33:19 +0300
committerChromium commit bot <commit-bot@chromium.org>2017-10-03 19:53:25 +0000
commitaafdc153a2b7609968b315ca6c6900717f6d6c36 (patch)
tree4e9671595b04047a507a64292f19114d9589be91 /core/fpdfapi/parser/cpdf_read_validator.cpp
parent609d1fd4a4360e2592c5c59d60758ac67a1cb4ee (diff)
downloadpdfium-aafdc153a2b7609968b315ca6c6900717f6d6c36.tar.xz
Unify CPDF_HintsTable.chromium/3232
Break relationship from CPDF_DataAvail for CPDF_HintsTable. Change-Id: If3e6d4910dd368742f095c05adb122ab08c0d804 Reviewed-on: https://pdfium-review.googlesource.com/15270 Commit-Queue: Art Snake <art-snake@yandex-team.ru> Reviewed-by: dsinclair <dsinclair@chromium.org>
Diffstat (limited to 'core/fpdfapi/parser/cpdf_read_validator.cpp')
-rw-r--r--core/fpdfapi/parser/cpdf_read_validator.cpp28
1 files changed, 24 insertions, 4 deletions
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 <algorithm>
+#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<FX_FILESIZE>(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;
}