Index: core/fpdfapi/parser/cpdf_data_avail.cpp |
diff --git a/core/fpdfapi/parser/cpdf_data_avail.cpp b/core/fpdfapi/parser/cpdf_data_avail.cpp |
index 3fe4b03da62012ae33d8cbf50944708e5572224f..d3d70adbe9731d609a1cde298d0fd3e17dcd2b1c 100644 |
--- a/core/fpdfapi/parser/cpdf_data_avail.cpp |
+++ b/core/fpdfapi/parser/cpdf_data_avail.cpp |
@@ -957,11 +957,13 @@ bool CPDF_DataAvail::GetNextChar(uint8_t& ch) { |
if ((FX_FILESIZE)(read_pos + read_size) > m_dwFileLen) |
read_pos = m_dwFileLen - read_size; |
- if (!m_pFileRead->ReadBlock(m_bufferData, read_pos, read_size)) |
+ uint32_t read_real_size = |
+ m_pFileRead->ReadBlock(m_bufferData, read_pos, read_size); |
+ if (read_real_size != read_size && !m_pFileRead->IsEOF()) |
return false; |
m_bufferOffset = read_pos; |
- m_bufferSize = read_size; |
+ m_bufferSize = read_real_size; |
} |
ch = m_bufferData[pos - m_bufferOffset]; |
m_Pos++; |
@@ -1062,7 +1064,8 @@ bool CPDF_DataAvail::CheckTrailer(DownloadHints* pHints) { |
int32_t iTrailerSize = |
(int32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); |
if (m_pFileAvail->IsDataAvail(m_Pos, iTrailerSize)) { |
- int32_t iSize = (int32_t)(m_Pos + iTrailerSize - m_dwTrailerOffset); |
+ uint32_t iSize = pdfium::base::checked_cast<uint32_t>(m_Pos + iTrailerSize - |
+ m_dwTrailerOffset); |
CFX_BinaryBuf buf(iSize); |
uint8_t* pBuf = buf.GetBuffer(); |
if (!pBuf) { |
@@ -1070,10 +1073,11 @@ bool CPDF_DataAvail::CheckTrailer(DownloadHints* pHints) { |
return false; |
} |
- if (!m_pFileRead->ReadBlock(pBuf, m_dwTrailerOffset, iSize)) |
+ uint32_t readSize = m_pFileRead->ReadBlock(pBuf, m_dwTrailerOffset, iSize); |
+ if (readSize != iSize && !m_pFileRead->IsEOF()) |
return false; |
- ScopedFileStream file(FX_CreateMemoryStream(pBuf, (size_t)iSize, false)); |
+ ScopedFileStream file(FX_CreateMemoryStream(pBuf, (size_t)readSize, false)); |
m_syntaxParser.InitParser(file.get(), 0); |
std::unique_ptr<CPDF_Object> pTrailer( |