| Index: fpdfsdk/src/fpdfview.cpp
|
| diff --git a/fpdfsdk/src/fpdfview.cpp b/fpdfsdk/src/fpdfview.cpp
|
| index 041adda21f8e4fccf18d9d309567e1e1b3f846fa..e59515a86353a99cacca99c9e3b7637a084868b2 100644
|
| --- a/fpdfsdk/src/fpdfview.cpp
|
| +++ b/fpdfsdk/src/fpdfview.cpp
|
| @@ -827,11 +827,15 @@ DLLEXPORT FPDF_DWORD STDCALL FPDF_CountNamedDests(FPDF_DOCUMENT document) {
|
| return 0;
|
|
|
| CPDF_NameTree nameTree(pDoc, "Dests");
|
| - int count = nameTree.GetCount();
|
| + pdfium::base::CheckedNumeric<FPDF_DWORD> count = nameTree.GetCount();
|
| CPDF_Dictionary* pDest = pRoot->GetDict("Dests");
|
| if (pDest)
|
| count += pDest->GetCount();
|
| - return count;
|
| +
|
| + if (!count.IsValid())
|
| + return 0;
|
| +
|
| + return count.ValueOrDie();
|
| }
|
|
|
| DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document,
|
| @@ -865,21 +869,25 @@ DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDest(FPDF_DOCUMENT document,
|
| if (!pRoot)
|
| return nullptr;
|
|
|
| - CPDF_Object* pDestObj = NULL;
|
| + CPDF_Object* pDestObj = nullptr;
|
| CFX_ByteString bsName;
|
| CPDF_NameTree nameTree(pDoc, "Dests");
|
| int count = nameTree.GetCount();
|
| if (index >= count) {
|
| CPDF_Dictionary* pDest = pRoot->GetDict("Dests");
|
| if (!pDest)
|
| - return NULL;
|
| - if (index >= count + pDest->GetCount())
|
| - return NULL;
|
| + return nullptr;
|
| +
|
| + pdfium::base::CheckedNumeric<int> checked_count = count;
|
| + checked_count += pDest->GetCount();
|
| + if (!checked_count.IsValid() || index >= checked_count.ValueOrDie())
|
| + return nullptr;
|
| +
|
| index -= count;
|
| - FX_POSITION pos = pDest->GetStartPos();
|
| int i = 0;
|
| - while (pos) {
|
| - pDestObj = pDest->GetNextElement(pos, bsName);
|
| + for (const auto& it : *pDest) {
|
| + bsName = it.first;
|
| + pDestObj = it.second;
|
| if (!pDestObj)
|
| continue;
|
| if (i == index)
|
|
|