| 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 76ea73d80f89970466c2df58a6490c4004c43831..d94ef2c69c8d6f99c940a0c72c38cc6b0122c428 100644
|
| --- a/core/fpdfapi/parser/cpdf_data_avail.cpp
|
| +++ b/core/fpdfapi/parser/cpdf_data_avail.cpp
|
| @@ -24,6 +24,7 @@
|
| #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/ptr_util.h"
|
| #include "third_party/base/stl_util.h"
|
|
|
| CPDF_DataAvail::FileAvail::~FileAvail() {}
|
| @@ -1147,16 +1148,16 @@ bool CPDF_DataAvail::CheckArrayPageNode(uint32_t dwPageNo,
|
| if (!pKid)
|
| continue;
|
|
|
| - PageNode* pNode = new PageNode();
|
| - pPageNode->m_childNode.Add(pNode);
|
| + auto pNode = pdfium::MakeUnique<PageNode>();
|
| pNode->m_dwPageNo = pKid->GetRefObjNum();
|
| + pPageNode->m_ChildNodes.push_back(std::move(pNode));
|
| }
|
| return true;
|
| }
|
|
|
| -bool CPDF_DataAvail::CheckUnkownPageNode(uint32_t dwPageNo,
|
| - PageNode* pPageNode,
|
| - DownloadHints* pHints) {
|
| +bool CPDF_DataAvail::CheckUnknownPageNode(uint32_t dwPageNo,
|
| + PageNode* pPageNode,
|
| + DownloadHints* pHints) {
|
| bool bExist = false;
|
| std::unique_ptr<CPDF_Object> pPage = GetObject(dwPageNo, pHints, &bExist);
|
| if (!bExist) {
|
| @@ -1195,9 +1196,9 @@ bool CPDF_DataAvail::CheckUnkownPageNode(uint32_t dwPageNo,
|
| switch (pKids->GetType()) {
|
| case CPDF_Object::REFERENCE: {
|
| CPDF_Reference* pKid = pKids->AsReference();
|
| - PageNode* pNode = new PageNode();
|
| - pPageNode->m_childNode.Add(pNode);
|
| + auto pNode = pdfium::MakeUnique<PageNode>();
|
| pNode->m_dwPageNo = pKid->GetRefObjNum();
|
| + pPageNode->m_ChildNodes.push_back(std::move(pNode));
|
| } break;
|
| case CPDF_Object::ARRAY: {
|
| CPDF_Array* pKidsArray = pKids->AsArray();
|
| @@ -1206,9 +1207,9 @@ bool CPDF_DataAvail::CheckUnkownPageNode(uint32_t dwPageNo,
|
| if (!pKid)
|
| continue;
|
|
|
| - PageNode* pNode = new PageNode();
|
| - pPageNode->m_childNode.Add(pNode);
|
| + auto pNode = pdfium::MakeUnique<PageNode>();
|
| pNode->m_dwPageNo = pKid->GetRefObjNum();
|
| + pPageNode->m_ChildNodes.push_back(std::move(pNode));
|
| }
|
| } break;
|
| default:
|
| @@ -1223,7 +1224,7 @@ bool CPDF_DataAvail::CheckUnkownPageNode(uint32_t dwPageNo,
|
| return true;
|
| }
|
|
|
| -bool CPDF_DataAvail::CheckPageNode(CPDF_DataAvail::PageNode& pageNodes,
|
| +bool CPDF_DataAvail::CheckPageNode(const CPDF_DataAvail::PageNode& pageNode,
|
| int32_t iPage,
|
| int32_t& iCount,
|
| DownloadHints* pHints,
|
| @@ -1231,24 +1232,27 @@ bool CPDF_DataAvail::CheckPageNode(CPDF_DataAvail::PageNode& pageNodes,
|
| if (level >= kMaxPageRecursionDepth)
|
| return false;
|
|
|
| - int32_t iSize = pageNodes.m_childNode.GetSize();
|
| + int32_t iSize = pdfium::CollectionSize<int32_t>(pageNode.m_ChildNodes);
|
| if (iSize <= 0 || iPage >= iSize) {
|
| m_docStatus = PDF_DATAAVAIL_ERROR;
|
| return false;
|
| }
|
| -
|
| for (int32_t i = 0; i < iSize; ++i) {
|
| - PageNode* pNode = pageNodes.m_childNode.GetAt(i);
|
| + PageNode* pNode = pageNode.m_ChildNodes[i].get();
|
| if (!pNode)
|
| continue;
|
|
|
| + if (pNode->m_type == PDF_PAGENODE_UNKNOWN) {
|
| + // Updates the type for the unknown page node.
|
| + if (!CheckUnknownPageNode(pNode->m_dwPageNo, pNode, pHints))
|
| + return false;
|
| + }
|
| + if (pNode->m_type == PDF_PAGENODE_ARRAY) {
|
| + // Updates a more specific type for the array page node.
|
| + if (!CheckArrayPageNode(pNode->m_dwPageNo, pNode, pHints))
|
| + return false;
|
| + }
|
| switch (pNode->m_type) {
|
| - case PDF_PAGENODE_UNKNOWN:
|
| - if (!CheckUnkownPageNode(pNode->m_dwPageNo, pNode, pHints)) {
|
| - return false;
|
| - }
|
| - --i;
|
| - break;
|
| case PDF_PAGENODE_PAGE:
|
| iCount++;
|
| if (iPage == iCount && m_pDocument)
|
| @@ -1258,13 +1262,11 @@ bool CPDF_DataAvail::CheckPageNode(CPDF_DataAvail::PageNode& pageNodes,
|
| if (!CheckPageNode(*pNode, iPage, iCount, pHints, level + 1))
|
| return false;
|
| break;
|
| + case PDF_PAGENODE_UNKNOWN:
|
| case PDF_PAGENODE_ARRAY:
|
| - if (!CheckArrayPageNode(pNode->m_dwPageNo, pNode, pHints))
|
| - return false;
|
| - --i;
|
| - break;
|
| + // Already converted above, error if we get here.
|
| + return false;
|
| }
|
| -
|
| if (iPage == iCount) {
|
| m_docStatus = PDF_DATAAVAIL_DONE;
|
| return true;
|
| @@ -1281,17 +1283,12 @@ bool CPDF_DataAvail::LoadDocPage(uint32_t dwPage, DownloadHints* pHints) {
|
| m_docStatus = PDF_DATAAVAIL_DONE;
|
| return true;
|
| }
|
| -
|
| - if (m_pageNodes.m_type == PDF_PAGENODE_PAGE) {
|
| - if (iPage == 0) {
|
| - m_docStatus = PDF_DATAAVAIL_DONE;
|
| - return true;
|
| - }
|
| - m_docStatus = PDF_DATAAVAIL_ERROR;
|
| + if (m_PageNode.m_type == PDF_PAGENODE_PAGE) {
|
| + m_docStatus = iPage == 0 ? PDF_DATAAVAIL_DONE : PDF_DATAAVAIL_ERROR;
|
| return true;
|
| }
|
| int32_t iCount = -1;
|
| - return CheckPageNode(m_pageNodes, iPage, iCount, pHints, 0);
|
| + return CheckPageNode(m_PageNode, iPage, iCount, pHints, 0);
|
| }
|
|
|
| bool CPDF_DataAvail::CheckPageCount(DownloadHints* pHints) {
|
| @@ -1319,7 +1316,7 @@ bool CPDF_DataAvail::CheckPageCount(DownloadHints* pHints) {
|
| }
|
|
|
| bool CPDF_DataAvail::LoadDocPages(DownloadHints* pHints) {
|
| - if (!CheckUnkownPageNode(m_PagesObjNum, &m_pageNodes, pHints))
|
| + if (!CheckUnknownPageNode(m_PagesObjNum, &m_PageNode, pHints))
|
| return false;
|
|
|
| if (CheckPageCount(pHints)) {
|
| @@ -1703,8 +1700,4 @@ bool CPDF_DataAvail::ValidateForm() {
|
|
|
| CPDF_DataAvail::PageNode::PageNode() : m_type(PDF_PAGENODE_UNKNOWN) {}
|
|
|
| -CPDF_DataAvail::PageNode::~PageNode() {
|
| - for (int32_t i = 0; i < m_childNode.GetSize(); ++i)
|
| - delete m_childNode[i];
|
| - m_childNode.RemoveAll();
|
| -}
|
| +CPDF_DataAvail::PageNode::~PageNode() {}
|
|
|