Index: xfa/fgas/crt/fgas_stream.cpp |
diff --git a/xfa/fgas/crt/fgas_stream.cpp b/xfa/fgas/crt/fgas_stream.cpp |
index c3850c00bbe36d7711e113d72c28879aba9d542b..6e3bfa2af94f64543b1593d63c2115a32c4932e5 100644 |
--- a/xfa/fgas/crt/fgas_stream.cpp |
+++ b/xfa/fgas/crt/fgas_stream.cpp |
@@ -282,12 +282,14 @@ class CFGAS_FileRead : public IFX_SeekableReadStream { |
// IFX_SeekableReadStream |
void Release() override; |
+ bool IsEOF() override; |
FX_FILESIZE GetSize() override; |
- bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override; |
+ size_t ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override; |
protected: |
bool m_bReleaseStream; |
IFX_Stream* m_pStream; |
+ FX_FILESIZE m_nCurPos; |
}; |
int32_t FileLength(FXSYS_FILE* file) { |
@@ -576,9 +578,11 @@ int32_t CFX_FileReadStreamImp::ReadData(uint8_t* pBuffer, int32_t iBufferSize) { |
if (iBufferSize > m_iLength - m_iPosition) { |
iBufferSize = m_iLength - m_iPosition; |
} |
- if (m_pFileRead->ReadBlock(pBuffer, m_iPosition, iBufferSize)) { |
- m_iPosition += iBufferSize; |
- return iBufferSize; |
+ int32_t readSize = pdfium::base::checked_cast<int32_t>( |
+ m_pFileRead->ReadBlock(pBuffer, m_iPosition, iBufferSize)); |
+ if (readSize == iBufferSize || m_pFileRead->IsEOF()) { |
+ m_iPosition += readSize; |
+ return readSize; |
} |
return 0; |
} |
@@ -1459,7 +1463,7 @@ IFX_SeekableReadStream* FX_CreateFileRead(IFX_Stream* pBaseStream, |
} |
CFGAS_FileRead::CFGAS_FileRead(IFX_Stream* pStream, bool bReleaseStream) |
- : m_bReleaseStream(bReleaseStream), m_pStream(pStream) { |
+ : m_bReleaseStream(bReleaseStream), m_pStream(pStream), m_nCurPos(0) { |
ASSERT(m_pStream); |
} |
CFGAS_FileRead::~CFGAS_FileRead() { |
@@ -1467,14 +1471,20 @@ CFGAS_FileRead::~CFGAS_FileRead() { |
m_pStream->Release(); |
} |
} |
+bool CFGAS_FileRead::IsEOF() { |
+ return m_nCurPos >= (FX_FILESIZE)m_pStream->GetLength(); |
+} |
FX_FILESIZE CFGAS_FileRead::GetSize() { |
return (FX_FILESIZE)m_pStream->GetLength(); |
} |
-bool CFGAS_FileRead::ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) { |
+size_t CFGAS_FileRead::ReadBlock(void* buffer, |
+ FX_FILESIZE offset, |
+ size_t size) { |
m_pStream->Seek(FX_STREAMSEEK_Begin, (int32_t)offset); |
int32_t iLen = m_pStream->ReadData((uint8_t*)buffer, (int32_t)size); |
- return iLen == (int32_t)size; |
+ m_nCurPos = offset + pdfium::base::checked_cast<size_t>(iLen); |
+ return pdfium::base::checked_cast<size_t>(iLen); |
} |
void CFGAS_FileRead::Release() { |