summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/fpdfapi/parser/cpdf_data_avail.cpp21
-rw-r--r--core/fpdfapi/parser/cpdf_data_avail.h2
2 files changed, 12 insertions, 11 deletions
diff --git a/core/fpdfapi/parser/cpdf_data_avail.cpp b/core/fpdfapi/parser/cpdf_data_avail.cpp
index 93e4472d94..d298fb7249 100644
--- a/core/fpdfapi/parser/cpdf_data_avail.cpp
+++ b/core/fpdfapi/parser/cpdf_data_avail.cpp
@@ -270,7 +270,7 @@ bool CPDF_DataAvail::CheckDocStatus(DownloadHints* pHints) {
case PDF_DATAAVAIL_HINTTABLE:
return CheckHintTables(pHints);
case PDF_DATAAVAIL_END:
- return CheckEnd(pHints);
+ return CheckEnd();
case PDF_DATAAVAIL_CROSSREF:
return CheckCrossRef(pHints);
case PDF_DATAAVAIL_CROSSREF_ITEM:
@@ -743,16 +743,17 @@ bool CPDF_DataAvail::IsLinearizedFile(uint8_t* pData, uint32_t dwLen) {
return true;
}
-bool CPDF_DataAvail::CheckEnd(DownloadHints* pHints) {
- uint32_t req_pos = (uint32_t)(m_dwFileLen > 1024 ? m_dwFileLen - 1024 : 0);
- uint32_t dwSize = (uint32_t)(m_dwFileLen - req_pos);
- if (!m_pFileAvail->IsDataAvail(req_pos, dwSize)) {
- pHints->AddSegment(req_pos, dwSize);
- return false;
- }
-
+bool CPDF_DataAvail::CheckEnd() {
+ const uint32_t req_pos =
+ (uint32_t)(m_dwFileLen > 1024 ? m_dwFileLen - 1024 : 0);
+ const uint32_t dwSize = (uint32_t)(m_dwFileLen - req_pos);
std::vector<uint8_t> buffer(dwSize);
- m_pFileRead->ReadBlock(buffer.data(), req_pos, dwSize);
+ {
+ const CPDF_ReadValidator::Session read_session(GetValidator().Get());
+ m_pFileRead->ReadBlock(buffer.data(), req_pos, dwSize);
+ if (GetValidator()->has_read_problems())
+ return false;
+ }
auto file = pdfium::MakeRetain<CFX_MemoryStream>(
buffer.data(), static_cast<size_t>(dwSize), false);
diff --git a/core/fpdfapi/parser/cpdf_data_avail.h b/core/fpdfapi/parser/cpdf_data_avail.h
index dec6b30a79..fe7b26b21d 100644
--- a/core/fpdfapi/parser/cpdf_data_avail.h
+++ b/core/fpdfapi/parser/cpdf_data_avail.h
@@ -133,7 +133,7 @@ class CPDF_DataAvail final {
bool CheckHeader();
bool CheckFirstPage(DownloadHints* pHints);
bool CheckHintTables(DownloadHints* pHints);
- bool CheckEnd(DownloadHints* pHints);
+ bool CheckEnd();
bool CheckCrossRef(DownloadHints* pHints);
bool CheckCrossRefItem();
bool CheckTrailer(DownloadHints* pHints);