| Index: fpdfsdk/fpdfview.cpp
|
| diff --git a/fpdfsdk/fpdfview.cpp b/fpdfsdk/fpdfview.cpp
|
| index 334c14cd45f9d1ed834d80b72bc3595c0de775cd..458153a7def2f2a5c4fa06276e819a486ef68bdf 100644
|
| --- a/fpdfsdk/fpdfview.cpp
|
| +++ b/fpdfsdk/fpdfview.cpp
|
| @@ -120,18 +120,18 @@ FX_FILESIZE CFPDF_FileStream::GetPosition() {
|
| return m_nCurPos;
|
| }
|
|
|
| -bool CFPDF_FileStream::ReadBlock(void* buffer,
|
| - FX_FILESIZE offset,
|
| - size_t size) {
|
| +size_t CFPDF_FileStream::ReadBlock(void* buffer,
|
| + FX_FILESIZE offset,
|
| + size_t size) {
|
| if (!buffer || !size || !m_pFS->ReadBlock)
|
| - return false;
|
| + return 0;
|
|
|
| if (m_pFS->ReadBlock(m_pFS->clientData, (FPDF_DWORD)offset, buffer,
|
| (FPDF_DWORD)size) == 0) {
|
| m_nCurPos = offset + size;
|
| - return true;
|
| + return size;
|
| }
|
| - return false;
|
| + return 0;
|
| }
|
|
|
| size_t CFPDF_FileStream::ReadBlock(void* buffer, size_t size) {
|
| @@ -176,7 +176,7 @@ bool CFPDF_FileStream::Flush() {
|
| #endif // PDF_ENABLE_XFA
|
|
|
| CPDF_CustomAccess::CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess)
|
| - : m_FileAccess(*pFileAccess) {}
|
| + : m_FileAccess(*pFileAccess), m_nCurPos(0) {}
|
|
|
| FX_FILESIZE CPDF_CustomAccess::GetSize() {
|
| return m_FileAccess.m_FileLen;
|
| @@ -186,20 +186,26 @@ void CPDF_CustomAccess::Release() {
|
| delete this;
|
| }
|
|
|
| -bool CPDF_CustomAccess::ReadBlock(void* buffer,
|
| - FX_FILESIZE offset,
|
| - size_t size) {
|
| - if (offset < 0)
|
| - return false;
|
| +bool CPDF_CustomAccess::IsEOF() {
|
| + return m_nCurPos >= static_cast<FX_FILESIZE>(m_FileAccess.m_FileLen);
|
| +}
|
|
|
| - FX_SAFE_FILESIZE newPos = pdfium::base::checked_cast<FX_FILESIZE>(size);
|
| +size_t CPDF_CustomAccess::ReadBlock(void* buffer,
|
| + FX_FILESIZE offset,
|
| + size_t size) {
|
| + if (offset < 0) {
|
| + return 0;
|
| + }
|
| + FX_SAFE_FILESIZE newPos =
|
| + pdfium::base::checked_cast<FX_FILESIZE, size_t>(size);
|
| newPos += offset;
|
| if (!newPos.IsValid() ||
|
| newPos.ValueOrDie() > static_cast<FX_FILESIZE>(m_FileAccess.m_FileLen)) {
|
| - return false;
|
| + return 0;
|
| }
|
| - return !!m_FileAccess.m_GetBlock(m_FileAccess.m_Param, offset,
|
| - reinterpret_cast<uint8_t*>(buffer), size);
|
| + m_FileAccess.m_GetBlock(m_FileAccess.m_Param, offset, (uint8_t*)buffer, size);
|
| + m_nCurPos = newPos.ValueOrDie();
|
| + return size;
|
| }
|
|
|
| // 0 bit: FPDF_POLICY_MACHINETIME_ACCESS
|
| @@ -379,21 +385,24 @@ DLLEXPORT FPDF_BOOL STDCALL FPDF_LoadXFA(FPDF_DOCUMENT document) {
|
|
|
| class CMemFile final : public IFX_SeekableReadStream {
|
| public:
|
| - CMemFile(uint8_t* pBuf, FX_FILESIZE size) : m_pBuf(pBuf), m_size(size) {}
|
| + CMemFile(uint8_t* pBuf, FX_FILESIZE size)
|
| + : m_pBuf(pBuf), m_size(size), m_nCurPos(0) {}
|
|
|
| void Release() override { delete this; }
|
| + bool IsEOF() override { return m_nCurPos >= m_size; }
|
| FX_FILESIZE GetSize() override { return m_size; }
|
| - bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override {
|
| + size_t ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override {
|
| if (offset < 0) {
|
| - return false;
|
| + return 0;
|
| }
|
| FX_SAFE_FILESIZE newPos = pdfium::base::checked_cast<FX_FILESIZE>(size);
|
| newPos += offset;
|
| if (!newPos.IsValid() || newPos.ValueOrDie() > m_size) {
|
| - return false;
|
| + return 0;
|
| }
|
| FXSYS_memcpy(buffer, m_pBuf + offset, size);
|
| - return true;
|
| + m_nCurPos = offset + size;
|
| + return size;
|
| }
|
|
|
| private:
|
| @@ -401,6 +410,7 @@ class CMemFile final : public IFX_SeekableReadStream {
|
|
|
| uint8_t* const m_pBuf;
|
| const FX_FILESIZE m_size;
|
| + FX_FILESIZE m_nCurPos;
|
| };
|
|
|
| DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadMemDocument(const void* data_buf,
|
|
|