| Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| index 14597d989c1589bac6c80a2b83462ab652b8ad4d..caf40544dcb5b08eb6d2749b100ebc2e4b212a6f 100644
|
| --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| @@ -2869,7 +2869,7 @@ FX_BOOL CPDF_DataAvail::IsObjectsAvail(CFX_PtrArray& obj_array, FX_BOOL bParsePa
|
| if (size.ValueOrDefault(0) == 0 || offset < 0 || offset >= m_dwFileLen) {
|
| break;
|
| }
|
| -
|
| +
|
| size += offset;
|
| size += 512;
|
| if (!size.IsValid()) {
|
| @@ -3074,42 +3074,64 @@ FX_BOOL CPDF_DataAvail::LoadAllXref(IFX_DownloadHints* pHints)
|
| }
|
| CPDF_Object* CPDF_DataAvail::GetObject(FX_DWORD objnum, IFX_DownloadHints* pHints, FX_BOOL *pExistInFile)
|
| {
|
| - CPDF_Object *pRet = NULL;
|
| - if (pExistInFile) {
|
| + CPDF_Object *pRet = NULL;
|
| + FX_DWORD original_size = 0;
|
| + FX_FILESIZE offset = 0;
|
| + CPDF_Parser *pParser = NULL;
|
| +
|
| + if (pExistInFile) {
|
| *pExistInFile = TRUE;
|
| }
|
| +
|
| if (m_pDocument == NULL) {
|
| - FX_FILESIZE offset = m_parser.GetObjectOffset(objnum);
|
| - if (offset < 0) {
|
| - *pExistInFile = FALSE;
|
| - return NULL;
|
| - }
|
| - FX_DWORD size = (FX_DWORD)m_parser.GetObjectSize(objnum);
|
| - size = (FX_DWORD)(((FX_FILESIZE)(offset + size + 512)) > m_dwFileLen ? m_dwFileLen - offset : size + 512);
|
| - if (!m_pFileAvail->IsDataAvail(offset, size)) {
|
| - pHints->AddSegment(offset, size);
|
| - return NULL;
|
| - }
|
| - pRet = m_parser.ParseIndirectObject(NULL, objnum);
|
| - if (!pRet && pExistInFile) {
|
| - *pExistInFile = FALSE;
|
| - }
|
| - return pRet;
|
| + original_size = (FX_DWORD)m_parser.GetObjectSize(objnum);
|
| + offset = m_parser.GetObjectOffset(objnum);
|
| + pParser = &m_parser;
|
| + } else {
|
| + original_size = GetObjectSize(objnum, offset);
|
| + pParser = (CPDF_Parser *)(m_pDocument->GetParser());
|
| }
|
| - FX_FILESIZE offset = 0;
|
| - FX_DWORD size = GetObjectSize(objnum, offset);
|
| - size = (FX_DWORD)((FX_FILESIZE)(offset + size + 512) > m_dwFileLen ? m_dwFileLen - offset : size + 512);
|
| - if (!m_pFileAvail->IsDataAvail(offset, size)) {
|
| - pHints->AddSegment(offset, size);
|
| +
|
| + base::CheckedNumeric<FX_DWORD> size = original_size;
|
| + if (size.ValueOrDefault(0) == 0 || offset < 0 || offset >= m_dwFileLen) {
|
| + if (pExistInFile)
|
| + *pExistInFile = FALSE;
|
| +
|
| return NULL;
|
| }
|
| - CPDF_Parser *pParser = (CPDF_Parser *)(m_pDocument->GetParser());
|
| - pRet = pParser->ParseIndirectObject(NULL, objnum, NULL);
|
| +
|
| + size += offset;
|
| + size += 512;
|
| + if (!size.IsValid()) {
|
| + return NULL;
|
| + }
|
| +
|
| + if (size.ValueOrDie() > m_dwFileLen) {
|
| + size = m_dwFileLen - offset;
|
| + } else {
|
| + size = original_size + 512;
|
| + }
|
| +
|
| + if (!size.IsValid()) {
|
| + return NULL;
|
| + }
|
| +
|
| + if (!m_pFileAvail->IsDataAvail(offset, size.ValueOrDie())) {
|
| + pHints->AddSegment(offset, size.ValueOrDie());
|
| + return NULL;
|
| + }
|
| +
|
| + if (pParser) {
|
| + pRet = pParser->ParseIndirectObject(NULL, objnum, NULL);
|
| + }
|
| +
|
| if (!pRet && pExistInFile) {
|
| *pExistInFile = FALSE;
|
| }
|
| +
|
| return pRet;
|
| }
|
| +
|
| FX_BOOL CPDF_DataAvail::CheckInfo(IFX_DownloadHints* pHints)
|
| {
|
| FX_BOOL bExist = FALSE;
|
|
|