Add a GetOrCreateArray() helper function.
Making sure one dictionary contains an array is also a not uncommon
task. Add a helper to make doing it less tedious.
Change-Id: Id251023460138921099897f56f3a591b3bc684f7
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/91570
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp
index 4e71482..44fa2a1 100644
--- a/core/fpdfapi/parser/cpdf_document.cpp
+++ b/core/fpdfapi/parser/cpdf_document.cpp
@@ -459,9 +459,7 @@
return false;
if (iPage == nPages) {
- CPDF_Array* pPagesList = pPages->GetArrayFor("Kids");
- if (!pPagesList)
- pPagesList = pPages->SetNewFor<CPDF_Array>("Kids");
+ CPDF_Array* pPagesList = GetOrCreateArray(pPages, "Kids");
pPagesList->AppendNew<CPDF_Reference>(this, pPageDict->GetObjNum());
pPages->SetNewFor<CPDF_Number>("Count", nPages + 1);
pPageDict->SetNewFor<CPDF_Reference>("Parent", this, pPages->GetObjNum());
diff --git a/core/fpdfapi/parser/fpdf_parser_utility.cpp b/core/fpdfapi/parser/fpdf_parser_utility.cpp
index cccf189..086ef3d 100644
--- a/core/fpdfapi/parser/fpdf_parser_utility.cpp
+++ b/core/fpdfapi/parser/fpdf_parser_utility.cpp
@@ -93,6 +93,13 @@
return pObj ? pObj->GetInteger() : 0;
}
+CPDF_Array* GetOrCreateArray(CPDF_Dictionary* dict, const ByteString& key) {
+ CPDF_Array* result = dict->GetArrayFor(key);
+ if (result)
+ return result;
+ return dict->SetNewFor<CPDF_Array>(key);
+}
+
CPDF_Dictionary* GetOrCreateDict(CPDF_Dictionary* dict, const ByteString& key) {
CPDF_Dictionary* result = dict->GetDictFor(key);
if (result)
diff --git a/core/fpdfapi/parser/fpdf_parser_utility.h b/core/fpdfapi/parser/fpdf_parser_utility.h
index 2752610..1bf3c74 100644
--- a/core/fpdfapi/parser/fpdf_parser_utility.h
+++ b/core/fpdfapi/parser/fpdf_parser_utility.h
@@ -47,6 +47,7 @@
int32_t GetDirectInteger(const CPDF_Dictionary* pDict, const ByteString& key);
+CPDF_Array* GetOrCreateArray(CPDF_Dictionary* dict, const ByteString& key);
CPDF_Dictionary* GetOrCreateDict(CPDF_Dictionary* dict, const ByteString& key);
ByteString PDF_NameDecode(ByteStringView orig);
diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp
index 456acea..37a139e 100644
--- a/core/fpdfdoc/cpdf_formfield.cpp
+++ b/core/fpdfdoc/cpdf_formfield.cpp
@@ -743,10 +743,7 @@
}
void CPDF_FormField::SelectOption(int iOptIndex) {
- CPDF_Array* pArray = m_pDict->GetArrayFor("I");
- if (!pArray)
- pArray = m_pDict->SetNewFor<CPDF_Array>("I");
-
+ CPDF_Array* pArray = GetOrCreateArray(m_pDict.Get(), "I");
for (size_t i = 0; i < pArray->size(); i++) {
int iFind = pArray->GetIntegerAt(i);
if (iFind == iOptIndex)
diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp
index 817aa00..1889b3b 100644
--- a/fpdfsdk/fpdf_annot.cpp
+++ b/fpdfsdk/fpdf_annot.cpp
@@ -24,6 +24,7 @@
#include "core/fpdfapi/parser/cpdf_reference.h"
#include "core/fpdfapi/parser/cpdf_stream.h"
#include "core/fpdfapi/parser/cpdf_string.h"
+#include "core/fpdfapi/parser/fpdf_parser_utility.h"
#include "core/fpdfdoc/cpdf_annot.h"
#include "core/fpdfdoc/cpdf_color_utils.h"
#include "core/fpdfdoc/cpdf_formfield.h"
@@ -349,9 +350,7 @@
auto pNewAnnot = std::make_unique<CPDF_AnnotContext>(
pDict.Get(), IPDFPageFromFPDFPage(page));
- CPDF_Array* pAnnotList = pPage->GetDict()->GetArrayFor("Annots");
- if (!pAnnotList)
- pAnnotList = pPage->GetDict()->SetNewFor<CPDF_Array>("Annots");
+ CPDF_Array* pAnnotList = GetOrCreateArray(pPage->GetDict(), "Annots");
pAnnotList->Append(pDict);
// Caller takes ownership.
@@ -492,10 +491,7 @@
CPDF_Dictionary* annot_dict = GetAnnotDictFromFPDFAnnotation(annot);
- CPDF_Array* inklist = annot_dict->GetArrayFor("InkList");
- if (!inklist)
- inklist = annot_dict->SetNewFor<CPDF_Array>("InkList");
-
+ CPDF_Array* inklist = GetOrCreateArray(annot_dict, "InkList");
FX_SAFE_SIZE_T safe_ink_size = inklist->size();
safe_ink_size += 1;
if (!safe_ink_size.IsValid<int32_t>())