| Index: core/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
|
| diff --git a/core/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp b/core/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
|
| index 61bbf67853ffe50e91f0f339b0a40eaedfd4355a..ceca67ceef8cc1b00fa29f50b56afa26701dd91b 100644
|
| --- a/core/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
|
| +++ b/core/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
|
| @@ -6,6 +6,7 @@
|
|
|
| #include <limits.h>
|
|
|
| +#include <set>
|
| #include <vector>
|
|
|
| #include "core/fpdfapi/fpdf_font/include/cpdf_font.h"
|
| @@ -1008,11 +1009,11 @@ static int InsertDeletePDFPage(CPDF_Document* pDoc,
|
| int nPagesToGo,
|
| CPDF_Dictionary* pPage,
|
| FX_BOOL bInsert,
|
| - CFX_ArrayTemplate<CPDF_Dictionary*>& stackList) {
|
| + std::set<CPDF_Dictionary*>* pVisited) {
|
| CPDF_Array* pKidList = pPages->GetArrayBy("Kids");
|
| - if (!pKidList) {
|
| + if (!pKidList)
|
| return -1;
|
| - }
|
| +
|
| for (size_t i = 0; i < pKidList->GetCount(); i++) {
|
| CPDF_Dictionary* pKid = pKidList->GetDictAt(i);
|
| if (pKid->GetStringBy("Type") == "Page") {
|
| @@ -1031,18 +1032,13 @@ static int InsertDeletePDFPage(CPDF_Document* pDoc,
|
| } else {
|
| int nPages = pKid->GetIntegerBy("Count");
|
| if (nPagesToGo < nPages) {
|
| - int stackCount = stackList.GetSize();
|
| - for (int j = 0; j < stackCount; ++j) {
|
| - if (pKid == stackList[j]) {
|
| - return -1;
|
| - }
|
| - }
|
| - stackList.Add(pKid);
|
| + if (pdfium::ContainsValue(*pVisited, pKid))
|
| + return -1;
|
| + pdfium::ScopedSetInsertion<CPDF_Dictionary*>(pVisited, pKid);
|
| if (InsertDeletePDFPage(pDoc, pKid, nPagesToGo, pPage, bInsert,
|
| - stackList) < 0) {
|
| + pVisited) < 0) {
|
| return -1;
|
| }
|
| - stackList.RemoveAt(stackCount);
|
| pPages->SetAtInteger(
|
| "Count", pPages->GetIntegerBy("Count") + (bInsert ? 1 : -1));
|
| return 1;
|
| @@ -1078,11 +1074,9 @@ static int InsertNewPage(CPDF_Document* pDoc,
|
| pPages->SetAtInteger("Count", nPages + 1);
|
| pPageDict->SetAtReference("Parent", pDoc, pPages->GetObjNum());
|
| } else {
|
| - CFX_ArrayTemplate<CPDF_Dictionary*> stack;
|
| - stack.Add(pPages);
|
| - if (InsertDeletePDFPage(pDoc, pPages, iPage, pPageDict, TRUE, stack) < 0) {
|
| + std::set<CPDF_Dictionary*> stack = {pPages};
|
| + if (InsertDeletePDFPage(pDoc, pPages, iPage, pPageDict, TRUE, &stack) < 0)
|
| return -1;
|
| - }
|
| }
|
| pageList.InsertAt(iPage, pPageDict->GetObjNum());
|
| return iPage;
|
| @@ -1108,22 +1102,21 @@ CPDF_Font* CPDF_Document::AddStandardFont(const FX_CHAR* font,
|
|
|
| void CPDF_Document::DeletePage(int iPage) {
|
| CPDF_Dictionary* pRoot = GetRoot();
|
| - if (!pRoot) {
|
| + if (!pRoot)
|
| return;
|
| - }
|
| +
|
| CPDF_Dictionary* pPages = pRoot->GetDictBy("Pages");
|
| - if (!pPages) {
|
| + if (!pPages)
|
| return;
|
| - }
|
| +
|
| int nPages = pPages->GetIntegerBy("Count");
|
| - if (iPage < 0 || iPage >= nPages) {
|
| + if (iPage < 0 || iPage >= nPages)
|
| return;
|
| - }
|
| - CFX_ArrayTemplate<CPDF_Dictionary*> stack;
|
| - stack.Add(pPages);
|
| - if (InsertDeletePDFPage(this, pPages, iPage, NULL, FALSE, stack) < 0) {
|
| +
|
| + std::set<CPDF_Dictionary*> stack = {pPages};
|
| + if (InsertDeletePDFPage(this, pPages, iPage, nullptr, FALSE, &stack) < 0)
|
| return;
|
| - }
|
| +
|
| m_PageList.RemoveAt(iPage);
|
| }
|
|
|
|
|