Check that result of CPDF_Array::GetDirectObjectAt() may be null.
Even if the index is in bounds, there might be a reference to
a non-existent object number, and null is returned. Fix a few
places where the result was immediately de-referenced.
Bug: pdfium:1267
Change-Id: Ib4bb4a7a43be432733faf127464ba66fa2301a98
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/52531
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index 8908228..2e53764 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -1287,7 +1287,8 @@
size_t n = pArray->size();
size_t nsegs = 0;
for (size_t i = 0; i < n; i++) {
- if (pArray->GetDirectObjectAt(i)->IsString())
+ const CPDF_Object* pDirectObject = pArray->GetDirectObjectAt(i);
+ if (pDirectObject && pDirectObject->IsString())
nsegs++;
}
if (nsegs == 0) {
@@ -1304,6 +1305,9 @@
float fInitKerning = 0;
for (size_t i = 0; i < n; i++) {
CPDF_Object* pObj = pArray->GetDirectObjectAt(i);
+ if (!pObj)
+ continue;
+
if (pObj->IsString()) {
ByteString str = pObj->GetString();
if (str.IsEmpty())
diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp
index ba15e1e..d5ac71b 100644
--- a/core/fpdfdoc/cpdf_formfield.cpp
+++ b/core/fpdfdoc/cpdf_formfield.cpp
@@ -564,11 +564,11 @@
break;
}
}
- for (int i = 0; i < static_cast<int>(pArray->size()); i++)
- if (pArray->GetDirectObjectAt(i)->GetUnicodeText() == opt_value &&
- i == iPos) {
+ for (int i = 0; i < static_cast<int>(pArray->size()); i++) {
+ const CPDF_Object* pDirectObj = pArray->GetDirectObjectAt(i);
+ if (pDirectObj && pDirectObj->GetUnicodeText() == opt_value && i == iPos)
return true;
- }
+ }
return false;
}
diff --git a/core/fpdfdoc/cpvt_generateap.cpp b/core/fpdfdoc/cpvt_generateap.cpp
index 0bdf701..d9c2785 100644
--- a/core/fpdfdoc/cpvt_generateap.cpp
+++ b/core/fpdfdoc/cpvt_generateap.cpp
@@ -1233,11 +1233,13 @@
if (CPDF_Object* pOpt = pOpts->GetDirectObjectAt(i)) {
WideString swItem;
- if (pOpt->IsString())
+ if (pOpt->IsString()) {
swItem = pOpt->GetUnicodeText();
- else if (CPDF_Array* pArray = pOpt->AsArray())
- swItem = pArray->GetDirectObjectAt(1)->GetUnicodeText();
-
+ } else if (CPDF_Array* pArray = pOpt->AsArray()) {
+ CPDF_Object* pDirectObj = pArray->GetDirectObjectAt(1);
+ if (pDirectObj)
+ swItem = pDirectObj->GetUnicodeText();
+ }
bool bSelected = false;
if (pSels) {
for (size_t s = 0, ssz = pSels->size(); s < ssz; s++) {