1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2018 The PDFium Authors 2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file. 4*3ac0a46fSAndroid Build Coastguard Worker 5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6*3ac0a46fSAndroid Build Coastguard Worker 7*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_customaccess.h" 8*3ac0a46fSAndroid Build Coastguard Worker 9*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fx_safe_types.h" 10*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/numerics/safe_conversions.h" 11*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_CustomAccess(FPDF_FILEACCESS * pFileAccess)12*3ac0a46fSAndroid Build Coastguard WorkerCPDFSDK_CustomAccess::CPDFSDK_CustomAccess(FPDF_FILEACCESS* pFileAccess) 13*3ac0a46fSAndroid Build Coastguard Worker : m_FileAccess(*pFileAccess) {} 14*3ac0a46fSAndroid Build Coastguard Worker 15*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_CustomAccess::~CPDFSDK_CustomAccess() = default; 16*3ac0a46fSAndroid Build Coastguard Worker GetSize()17*3ac0a46fSAndroid Build Coastguard WorkerFX_FILESIZE CPDFSDK_CustomAccess::GetSize() { 18*3ac0a46fSAndroid Build Coastguard Worker return m_FileAccess.m_FileLen; 19*3ac0a46fSAndroid Build Coastguard Worker } 20*3ac0a46fSAndroid Build Coastguard Worker ReadBlockAtOffset(pdfium::span<uint8_t> buffer,FX_FILESIZE offset)21*3ac0a46fSAndroid Build Coastguard Workerbool CPDFSDK_CustomAccess::ReadBlockAtOffset(pdfium::span<uint8_t> buffer, 22*3ac0a46fSAndroid Build Coastguard Worker FX_FILESIZE offset) { 23*3ac0a46fSAndroid Build Coastguard Worker if (buffer.empty() || offset < 0) 24*3ac0a46fSAndroid Build Coastguard Worker return false; 25*3ac0a46fSAndroid Build Coastguard Worker 26*3ac0a46fSAndroid Build Coastguard Worker if (!pdfium::base::IsValueInRangeForNumericType<FX_FILESIZE>(buffer.size())) 27*3ac0a46fSAndroid Build Coastguard Worker return false; 28*3ac0a46fSAndroid Build Coastguard Worker 29*3ac0a46fSAndroid Build Coastguard Worker FX_SAFE_FILESIZE new_pos = buffer.size(); 30*3ac0a46fSAndroid Build Coastguard Worker new_pos += offset; 31*3ac0a46fSAndroid Build Coastguard Worker return new_pos.IsValid() && new_pos.ValueOrDie() <= GetSize() && 32*3ac0a46fSAndroid Build Coastguard Worker m_FileAccess.m_GetBlock( 33*3ac0a46fSAndroid Build Coastguard Worker m_FileAccess.m_Param, 34*3ac0a46fSAndroid Build Coastguard Worker pdfium::base::checked_cast<unsigned long>(offset), buffer.data(), 35*3ac0a46fSAndroid Build Coastguard Worker pdfium::base::checked_cast<unsigned long>(buffer.size())); 36*3ac0a46fSAndroid Build Coastguard Worker } 37