| Index: core/fpdfdoc/cpdf_formfield.cpp
|
| diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp
|
| index ac6c01bae25a839de40f523ac3af59f9932c1069..8d7d0b4dc02f923edb55454fa1efa431c4cc00c2 100644
|
| --- a/core/fpdfdoc/cpdf_formfield.cpp
|
| +++ b/core/fpdfdoc/cpdf_formfield.cpp
|
| @@ -6,6 +6,8 @@
|
|
|
| #include "core/fpdfdoc/include/cpdf_formfield.h"
|
|
|
| +#include <set>
|
| +
|
| #include "core/fpdfapi/fpdf_parser/include/cfdf_document.h"
|
| #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
|
| #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
|
| @@ -16,6 +18,7 @@
|
| #include "core/fpdfdoc/cpvt_generateap.h"
|
| #include "core/fpdfdoc/include/cpdf_formcontrol.h"
|
| #include "core/fpdfdoc/include/cpdf_interform.h"
|
| +#include "third_party/base/stl_util.h"
|
|
|
| namespace {
|
|
|
| @@ -65,16 +68,20 @@ CPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict,
|
|
|
| CFX_WideString FPDF_GetFullName(CPDF_Dictionary* pFieldDict) {
|
| CFX_WideString full_name;
|
| + std::set<CPDF_Dictionary*> visited;
|
| CPDF_Dictionary* pLevel = pFieldDict;
|
| while (pLevel) {
|
| + visited.insert(pLevel);
|
| CFX_WideString short_name = pLevel->GetUnicodeTextBy("T");
|
| - if (short_name != L"") {
|
| - if (full_name == L"")
|
| + if (!short_name.IsEmpty()) {
|
| + if (full_name.IsEmpty())
|
| full_name = short_name;
|
| else
|
| full_name = short_name + L"." + full_name;
|
| }
|
| pLevel = pLevel->GetDictBy("Parent");
|
| + if (pdfium::ContainsKey(visited, pLevel))
|
| + break;
|
| }
|
| return full_name;
|
| }
|
| @@ -679,8 +686,8 @@ int CPDF_FormField::InsertOption(CFX_WideString csOptLabel,
|
| m_pDict->SetAt("Opt", pOpt);
|
| }
|
|
|
| - int iCount = (int)pOpt->GetCount();
|
| - if (index < 0 || index >= iCount) {
|
| + int iCount = pdfium::base::checked_cast<int, size_t>(pOpt->GetCount());
|
| + if (index >= iCount) {
|
| pOpt->AddString(csStr);
|
| index = iCount;
|
| } else {
|
|
|