Use safe math in FPDF_FileHandlerContext::ReadBlockAtOffset()
Avoid potential integer overflows.
Change-Id: I3055a50ddfc2f8604e28ae32160550e44b464fb2
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/123475
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Tom Sepez <tsepez@google.com>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/cpdfsdk_helpers.cpp b/fpdfsdk/cpdfsdk_helpers.cpp
index 8202ed8..6f8d0b7 100644
--- a/fpdfsdk/cpdfsdk_helpers.cpp
+++ b/fpdfsdk/cpdfsdk_helpers.cpp
@@ -141,16 +141,24 @@
bool FPDF_FileHandlerContext::ReadBlockAtOffset(pdfium::span<uint8_t> buffer,
FX_FILESIZE offset) {
- if (buffer.empty() || !m_pFS->ReadBlock)
+ if (buffer.empty() || !m_pFS->ReadBlock) {
return false;
+ }
+
+ FX_SAFE_FILESIZE new_position = offset;
+ new_position += buffer.size();
+ if (!new_position.IsValid()) {
+ return false;
+ }
if (m_pFS->ReadBlock(m_pFS->clientData, static_cast<FPDF_DWORD>(offset),
buffer.data(),
- static_cast<FPDF_DWORD>(buffer.size())) == 0) {
- m_nCurPos = offset + buffer.size();
- return true;
+ static_cast<FPDF_DWORD>(buffer.size())) != 0) {
+ return false;
}
- return false;
+
+ m_nCurPos = new_position.ValueOrDie();
+ return true;
}
bool FPDF_FileHandlerContext::WriteBlock(pdfium::span<const uint8_t> buffer) {