summaryrefslogtreecommitdiff
path: root/core/fpdfapi/parser/cpdf_read_validator.cpp
diff options
context:
space:
mode:
authorArtem Strygin <art-snake@yandex-team.ru>2017-10-02 22:07:55 +0300
committerChromium commit bot <commit-bot@chromium.org>2017-10-03 14:10:19 +0000
commit62b218074ea2bc658488c583362930a798b39107 (patch)
tree634ff6930024868b1956c5bfe796cfa4894df2c9 /core/fpdfapi/parser/cpdf_read_validator.cpp
parent0feba6f9ef721e4927e37da68ac27572ffae1453 (diff)
downloadpdfium-62b218074ea2bc658488c583362930a798b39107.tar.xz
Improve CPDF_ReadVaildator
Merge CPDF_ReadValidator::IsXXXAvailable and CPDF_ReadValidator::SheduleXXXDowload methods into one CheckXXXAndRequestIfUnavailable. Change-Id: Ib108d5bc3589df17269c841b0024dd4690909304 Reviewed-on: https://pdfium-review.googlesource.com/13730 Reviewed-by: dsinclair <dsinclair@chromium.org> Commit-Queue: Art Snake <art-snake@yandex-team.ru>
Diffstat (limited to 'core/fpdfapi/parser/cpdf_read_validator.cpp')
-rw-r--r--core/fpdfapi/parser/cpdf_read_validator.cpp55
1 files changed, 28 insertions, 27 deletions
diff --git a/core/fpdfapi/parser/cpdf_read_validator.cpp b/core/fpdfapi/parser/cpdf_read_validator.cpp
index bf086008ca..0f7eaa70a2 100644
--- a/core/fpdfapi/parser/cpdf_read_validator.cpp
+++ b/core/fpdfapi/parser/cpdf_read_validator.cpp
@@ -59,22 +59,18 @@ void CPDF_ReadValidator::ResetErrors() {
bool CPDF_ReadValidator::ReadBlock(void* buffer,
FX_FILESIZE offset,
size_t size) {
- // correct values checks:
- if (!pdfium::base::IsValueInRangeForNumericType<uint32_t>(size))
- return false;
-
FX_SAFE_FILESIZE end_offset = offset;
end_offset += size;
if (!end_offset.IsValid() || end_offset.ValueOrDie() > GetSize())
return false;
- if (!file_avail_ ||
- file_avail_->IsDataAvail(offset, static_cast<uint32_t>(size))) {
- if (file_read_->ReadBlock(buffer, offset, size))
- return true;
- read_error_ = true;
- }
- has_unavailable_data_ = true;
+ if (!CheckDataRangeAndRequestIfUnavailable(offset, size))
+ return false;
+
+ if (file_read_->ReadBlock(buffer, offset, size))
+ return true;
+
+ read_error_ = true;
ScheduleDownload(offset, size);
return false;
}
@@ -84,13 +80,7 @@ FX_FILESIZE CPDF_ReadValidator::GetSize() {
}
void CPDF_ReadValidator::ScheduleDownload(FX_FILESIZE offset, size_t size) {
- const FX_SAFE_UINT32 safe_size = size;
- if (safe_size.IsValid())
- ScheduleDataDownload(offset, safe_size.ValueOrDie());
-}
-
-void CPDF_ReadValidator::ScheduleDataDownload(FX_FILESIZE offset,
- uint32_t size) {
+ has_unavailable_data_ = true;
if (!hints_ || size == 0)
return;
@@ -104,7 +94,7 @@ void CPDF_ReadValidator::ScheduleDataDownload(FX_FILESIZE offset,
end_segment_offset =
std::min(GetSize(), AlignUp(end_segment_offset.ValueOrDie()));
- FX_SAFE_UINT32 segment_size = end_segment_offset;
+ FX_SAFE_SIZE_T segment_size = end_segment_offset;
segment_size -= start_segment_offset;
if (!segment_size.IsValid()) {
NOTREACHED();
@@ -113,19 +103,30 @@ void CPDF_ReadValidator::ScheduleDataDownload(FX_FILESIZE offset,
hints_->AddSegment(start_segment_offset, segment_size.ValueOrDie());
}
-void CPDF_ReadValidator::ScheduleDownloadWholeFile() {
- const FX_SAFE_UINT32 safe_size = GetSize();
- if (safe_size.IsValid())
- ScheduleDataDownload(0, safe_size.ValueOrDie());
-}
-
bool CPDF_ReadValidator::IsDataRangeAvailable(FX_FILESIZE offset,
- uint32_t size) const {
+ size_t size) const {
return !file_avail_ || file_avail_->IsDataAvail(offset, size);
}
bool CPDF_ReadValidator::IsWholeFileAvailable() {
- const FX_SAFE_UINT32 safe_size = GetSize();
+ const FX_SAFE_SIZE_T safe_size = GetSize();
return safe_size.IsValid() ? IsDataRangeAvailable(0, safe_size.ValueOrDie())
: false;
}
+
+bool CPDF_ReadValidator::CheckDataRangeAndRequestIfUnavailable(
+ FX_FILESIZE offset,
+ size_t size) {
+ if (IsDataRangeAvailable(offset, size))
+ return true;
+
+ ScheduleDownload(offset, size);
+ return false;
+}
+
+bool CPDF_ReadValidator::CheckWholeFileAndRequestIfUnavailable() {
+ const FX_SAFE_SIZE_T safe_size = GetSize();
+ return safe_size.IsValid()
+ ? CheckDataRangeAndRequestIfUnavailable(0, safe_size.ValueOrDie())
+ : false;
+}