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 1f43a4bdfef54ef04664311bba0c48a387b5fb44..3fe4b03da62012ae33d8cbf50944708e5572224f 100644 |
--- a/core/fpdfapi/parser/cpdf_data_avail.cpp |
+++ b/core/fpdfapi/parser/cpdf_data_avail.cpp |
@@ -23,6 +23,7 @@ |
#include "core/fpdfapi/parser/fpdf_parser_utility.h" |
#include "core/fxcrt/fx_ext.h" |
#include "core/fxcrt/fx_safe_types.h" |
+#include "third_party/base/numerics/safe_conversions.h" |
#include "third_party/base/stl_util.h" |
CPDF_DataAvail::FileAvail::~FileAvail() {} |
@@ -65,7 +66,6 @@ CPDF_DataAvail::CPDF_DataAvail(FileAvail* pFileAvail, |
m_bPageLoadedOK = false; |
m_bNeedDownLoadResource = false; |
m_bLinearizedFormParamLoad = false; |
- m_pRoot = nullptr; |
m_pTrailer = nullptr; |
m_pCurrentParser = nullptr; |
m_pAcroForm = nullptr; |
@@ -81,7 +81,6 @@ CPDF_DataAvail::CPDF_DataAvail(FileAvail* pFileAvail, |
CPDF_DataAvail::~CPDF_DataAvail() { |
m_pHintTables.reset(); |
- |
for (CPDF_Object* pObject : m_arrayAcroforms) |
delete pObject; |
} |
@@ -228,7 +227,7 @@ bool CPDF_DataAvail::CheckAcroFormSubObject(DownloadHints* pHints) { |
bool CPDF_DataAvail::CheckAcroForm(DownloadHints* pHints) { |
bool bExist = false; |
- m_pAcroForm = GetObject(m_dwAcroFormObjNum, pHints, &bExist); |
+ m_pAcroForm = GetObject(m_dwAcroFormObjNum, pHints, &bExist).release(); |
if (!bExist) { |
m_docStatus = PDF_DATAAVAIL_PAGETREE; |
return true; |
@@ -338,10 +337,9 @@ bool CPDF_DataAvail::LoadAllXref(DownloadHints* pHints) { |
return true; |
} |
-CPDF_Object* CPDF_DataAvail::GetObject(uint32_t objnum, |
- DownloadHints* pHints, |
- bool* pExistInFile) { |
- CPDF_Object* pRet = nullptr; |
+std::unique_ptr<CPDF_Object> CPDF_DataAvail::GetObject(uint32_t objnum, |
+ DownloadHints* pHints, |
+ bool* pExistInFile) { |
uint32_t size = 0; |
FX_FILESIZE offset = 0; |
CPDF_Parser* pParser = nullptr; |
@@ -361,6 +359,7 @@ CPDF_Object* CPDF_DataAvail::GetObject(uint32_t objnum, |
if (!IsDataAvail(offset, size, pHints)) |
return nullptr; |
+ std::unique_ptr<CPDF_Object> pRet; |
if (pParser) |
pRet = pParser->ParseIndirectObject(nullptr, objnum); |
@@ -372,28 +371,19 @@ CPDF_Object* CPDF_DataAvail::GetObject(uint32_t objnum, |
bool CPDF_DataAvail::CheckInfo(DownloadHints* pHints) { |
bool bExist = false; |
- CPDF_Object* pInfo = GetObject(m_dwInfoObjNum, pHints, &bExist); |
- if (!bExist) { |
- m_docStatus = |
- (m_bHaveAcroForm ? PDF_DATAAVAIL_ACROFORM : PDF_DATAAVAIL_PAGETREE); |
- return true; |
- } |
- |
- if (!pInfo) { |
+ std::unique_ptr<CPDF_Object> pInfo = |
+ GetObject(m_dwInfoObjNum, pHints, &bExist); |
+ if (bExist && !pInfo) { |
if (m_docStatus == PDF_DATAAVAIL_ERROR) { |
m_docStatus = PDF_DATAAVAIL_LOADALLFILE; |
return true; |
} |
- |
if (m_Pos == m_dwFileLen) |
m_docStatus = PDF_DATAAVAIL_ERROR; |
return false; |
} |
- |
- delete pInfo; |
m_docStatus = |
- (m_bHaveAcroForm ? PDF_DATAAVAIL_ACROFORM : PDF_DATAAVAIL_PAGETREE); |
- |
+ m_bHaveAcroForm ? PDF_DATAAVAIL_ACROFORM : PDF_DATAAVAIL_PAGETREE; |
return true; |
} |
@@ -471,14 +461,15 @@ bool CPDF_DataAvail::CheckPage(DownloadHints* pHints) { |
for (uint32_t i = 0; i < iPageObjs; ++i) { |
uint32_t dwPageObjNum = m_PageObjList.GetAt(i); |
bool bExist = false; |
- CPDF_Object* pObj = GetObject(dwPageObjNum, pHints, &bExist); |
+ std::unique_ptr<CPDF_Object> pObj = |
+ GetObject(dwPageObjNum, pHints, &bExist); |
if (!pObj) { |
if (bExist) |
UnavailObjList.Add(dwPageObjNum); |
continue; |
} |
- CPDF_Array* pArray = ToArray(pObj); |
+ CPDF_Array* pArray = ToArray(pObj.get()); |
if (pArray) { |
for (CPDF_Object* pArrayObj : *pArray) { |
if (CPDF_Reference* pRef = ToReference(pArrayObj)) |
@@ -487,16 +478,14 @@ bool CPDF_DataAvail::CheckPage(DownloadHints* pHints) { |
} |
if (!pObj->IsDictionary()) { |
- delete pObj; |
continue; |
} |
CFX_ByteString type = pObj->GetDict()->GetStringFor("Type"); |
if (type == "Pages") { |
- m_PagesArray.push_back(pObj); |
+ m_PagesArray.push_back(std::move(pObj)); |
continue; |
} |
- delete pObj; |
} |
m_PageObjList.RemoveAll(); |
@@ -507,25 +496,17 @@ bool CPDF_DataAvail::CheckPage(DownloadHints* pHints) { |
uint32_t iPages = m_PagesArray.size(); |
for (uint32_t i = 0; i < iPages; i++) { |
- CPDF_Object* pPages = m_PagesArray[i]; |
- if (!pPages) |
- continue; |
- |
- if (!GetPageKids(m_pCurrentParser, pPages)) { |
- delete pPages; |
- while (++i < iPages) |
- delete m_PagesArray[i]; |
- |
+ std::unique_ptr<CPDF_Object> pPages = std::move(m_PagesArray[i]); |
+ if (pPages && !GetPageKids(m_pCurrentParser, pPages.get())) { |
m_PagesArray.clear(); |
m_docStatus = PDF_DATAAVAIL_ERROR; |
return false; |
} |
- delete pPages; |
} |
- |
m_PagesArray.clear(); |
if (!m_PageObjList.GetSize()) |
m_docStatus = PDF_DATAAVAIL_DONE; |
+ |
return true; |
} |
@@ -560,7 +541,8 @@ bool CPDF_DataAvail::GetPageKids(CPDF_Parser* pParser, CPDF_Object* pPages) { |
bool CPDF_DataAvail::CheckPages(DownloadHints* pHints) { |
bool bExist = false; |
- CPDF_Object* pPages = GetObject(m_PagesObjNum, pHints, &bExist); |
+ std::unique_ptr<CPDF_Object> pPages = |
+ GetObject(m_PagesObjNum, pHints, &bExist); |
if (!bExist) { |
m_docStatus = PDF_DATAAVAIL_LOADALLFILE; |
return true; |
@@ -574,13 +556,11 @@ bool CPDF_DataAvail::CheckPages(DownloadHints* pHints) { |
return false; |
} |
- if (!GetPageKids(m_pCurrentParser, pPages)) { |
- delete pPages; |
+ if (!GetPageKids(m_pCurrentParser, pPages.get())) { |
m_docStatus = PDF_DATAAVAIL_ERROR; |
return false; |
} |
- delete pPages; |
m_docStatus = PDF_DATAAVAIL_PAGE; |
return true; |
} |
@@ -705,7 +685,7 @@ bool CPDF_DataAvail::CheckHintTables(DownloadHints* pHints) { |
return true; |
} |
-CPDF_Object* CPDF_DataAvail::ParseIndirectObjectAt( |
+std::unique_ptr<CPDF_Object> CPDF_DataAvail::ParseIndirectObjectAt( |
FX_FILESIZE pos, |
uint32_t objnum, |
CPDF_IndirectObjectHolder* pObjList) { |
@@ -731,7 +711,7 @@ CPDF_Object* CPDF_DataAvail::ParseIndirectObjectAt( |
return nullptr; |
} |
- CPDF_Object* pObj = |
+ std::unique_ptr<CPDF_Object> pObj = |
m_syntaxParser.GetObject(pObjList, parser_objnum, gennum, true); |
m_syntaxParser.RestorePos(SavedPos); |
return pObj; |
@@ -766,7 +746,6 @@ bool CPDF_DataAvail::IsLinearizedFile(uint8_t* pData, uint32_t dwLen) { |
return true; |
ScopedFileStream file(FX_CreateMemoryStream(pData, (size_t)dwLen, false)); |
- |
int32_t offset = GetHeaderOffset(file.get()); |
if (offset == -1) { |
m_docStatus = PDF_DATAAVAIL_ERROR; |
@@ -783,8 +762,8 @@ bool CPDF_DataAvail::IsLinearizedFile(uint8_t* pData, uint32_t dwLen) { |
return false; |
uint32_t objnum = FXSYS_atoui(wordObjNum.c_str()); |
- m_pLinearized = CPDF_LinearizedHeader::CreateForObject(pdfium::WrapUnique( |
- ParseIndirectObjectAt(m_syntaxParser.m_HeaderOffset + 9, objnum))); |
+ m_pLinearized = CPDF_LinearizedHeader::CreateForObject( |
+ ParseIndirectObjectAt(m_syntaxParser.m_HeaderOffset + 9, objnum)); |
if (!m_pLinearized || |
m_pLinearized->GetFileSize() != m_pFileRead->GetSize()) { |
m_pLinearized.reset(); |
@@ -857,7 +836,9 @@ int32_t CPDF_DataAvail::CheckCrossRefStream(DownloadHints* pHints, |
return -1; |
uint32_t objNum = FXSYS_atoui(objnum.c_str()); |
- CPDF_Object* pObj = m_parser.ParseIndirectObjectAt(nullptr, 0, objNum); |
+ std::unique_ptr<CPDF_Object> pObj = |
+ m_parser.ParseIndirectObjectAt(nullptr, 0, objNum); |
+ |
if (!pObj) { |
m_Pos += m_parser.m_pSyntax->SavePos(); |
return 0; |
@@ -865,15 +846,11 @@ int32_t CPDF_DataAvail::CheckCrossRefStream(DownloadHints* pHints, |
CPDF_Dictionary* pDict = pObj->GetDict(); |
CPDF_Name* pName = ToName(pDict ? pDict->GetObjectFor("Type") : nullptr); |
- if (pName) { |
- if (pName->GetString() == "XRef") { |
- m_Pos += m_parser.m_pSyntax->SavePos(); |
- xref_offset = pObj->GetDict()->GetIntegerFor("Prev"); |
- delete pObj; |
- return 1; |
- } |
+ if (pName && pName->GetString() == "XRef") { |
+ m_Pos += m_parser.m_pSyntax->SavePos(); |
+ xref_offset = pObj->GetDict()->GetIntegerFor("Prev"); |
+ return 1; |
} |
- delete pObj; |
return -1; |
} |
pHints->AddSegment(m_Pos, req_size); |
@@ -1168,7 +1145,7 @@ bool CPDF_DataAvail::CheckArrayPageNode(uint32_t dwPageNo, |
PageNode* pPageNode, |
DownloadHints* pHints) { |
bool bExist = false; |
- CPDF_Object* pPages = GetObject(dwPageNo, pHints, &bExist); |
+ std::unique_ptr<CPDF_Object> pPages = GetObject(dwPageNo, pHints, &bExist); |
if (!bExist) { |
m_docStatus = PDF_DATAAVAIL_ERROR; |
return false; |
@@ -1184,7 +1161,6 @@ bool CPDF_DataAvail::CheckArrayPageNode(uint32_t dwPageNo, |
CPDF_Array* pArray = pPages->AsArray(); |
if (!pArray) { |
- delete pPages; |
m_docStatus = PDF_DATAAVAIL_ERROR; |
return false; |
} |
@@ -1199,7 +1175,6 @@ bool CPDF_DataAvail::CheckArrayPageNode(uint32_t dwPageNo, |
pPageNode->m_childNode.Add(pNode); |
pNode->m_dwPageNo = pKid->GetRefObjNum(); |
} |
- delete pPages; |
return true; |
} |
@@ -1207,7 +1182,7 @@ bool CPDF_DataAvail::CheckUnkownPageNode(uint32_t dwPageNo, |
PageNode* pPageNode, |
DownloadHints* pHints) { |
bool bExist = false; |
- CPDF_Object* pPage = GetObject(dwPageNo, pHints, &bExist); |
+ std::unique_ptr<CPDF_Object> pPage = GetObject(dwPageNo, pHints, &bExist); |
if (!bExist) { |
m_docStatus = PDF_DATAAVAIL_ERROR; |
return false; |
@@ -1222,12 +1197,10 @@ bool CPDF_DataAvail::CheckUnkownPageNode(uint32_t dwPageNo, |
if (pPage->IsArray()) { |
pPageNode->m_dwPageNo = dwPageNo; |
pPageNode->m_type = PDF_PAGENODE_ARRAY; |
- delete pPage; |
return true; |
} |
if (!pPage->IsDictionary()) { |
- delete pPage; |
m_docStatus = PDF_DATAAVAIL_ERROR; |
return false; |
} |
@@ -1268,11 +1241,9 @@ bool CPDF_DataAvail::CheckUnkownPageNode(uint32_t dwPageNo, |
} else if (type == "Page") { |
pPageNode->m_type = PDF_PAGENODE_PAGE; |
} else { |
- delete pPage; |
m_docStatus = PDF_DATAAVAIL_ERROR; |
return false; |
} |
- delete pPage; |
return true; |
} |
@@ -1349,7 +1320,8 @@ bool CPDF_DataAvail::LoadDocPage(uint32_t dwPage, DownloadHints* pHints) { |
bool CPDF_DataAvail::CheckPageCount(DownloadHints* pHints) { |
bool bExist = false; |
- CPDF_Object* pPages = GetObject(m_PagesObjNum, pHints, &bExist); |
+ std::unique_ptr<CPDF_Object> pPages = |
+ GetObject(m_PagesObjNum, pHints, &bExist); |
if (!bExist) { |
m_docStatus = PDF_DATAAVAIL_ERROR; |
return false; |
@@ -1360,24 +1332,14 @@ bool CPDF_DataAvail::CheckPageCount(DownloadHints* pHints) { |
CPDF_Dictionary* pPagesDict = pPages->GetDict(); |
if (!pPagesDict) { |
- delete pPages; |
m_docStatus = PDF_DATAAVAIL_ERROR; |
return false; |
} |
- if (!pPagesDict->KeyExist("Kids")) { |
- delete pPages; |
+ if (!pPagesDict->KeyExist("Kids")) |
return true; |
- } |
- |
- int count = pPagesDict->GetIntegerFor("Count"); |
- if (count > 0) { |
- delete pPages; |
- return true; |
- } |
- delete pPages; |
- return false; |
+ return pPagesDict->GetIntegerFor("Count") > 0; |
} |
bool CPDF_DataAvail::LoadDocPages(DownloadHints* pHints) { |
@@ -1683,10 +1645,10 @@ CPDF_Dictionary* CPDF_DataAvail::GetPage(int index) { |
m_pDocument->SetPageObjNum(index, dwObjNum); |
// Page object already can be parsed in document. |
if (!m_pDocument->GetIndirectObject(dwObjNum)) { |
- m_syntaxParser.InitParser(m_pFileRead, (uint32_t)szPageStartPos); |
+ m_syntaxParser.InitParser( |
+ m_pFileRead, pdfium::base::checked_cast<uint32_t>(szPageStartPos)); |
m_pDocument->ReplaceIndirectObjectIfHigherGeneration( |
- dwObjNum, pdfium::WrapUnique<CPDF_Object>( |
- ParseIndirectObjectAt(0, dwObjNum, m_pDocument))); |
+ dwObjNum, ParseIndirectObjectAt(0, dwObjNum, m_pDocument)); |
} |
return m_pDocument->GetPage(index); |
} |