Return retained references from CPDF_Dictionary::GetArrayFor().

-- avoid re-assigning to locals where not required.

Change-Id: I683241498459e06276679bbbf698b886071cfee6
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/98154
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/font/cpdf_cidfont.cpp b/core/fpdfapi/font/cpdf_cidfont.cpp
index 3b67b7b..9fa160a 100644
--- a/core/fpdfapi/font/cpdf_cidfont.cpp
+++ b/core/fpdfapi/font/cpdf_cidfont.cpp
@@ -407,7 +407,8 @@
     return true;
   }
 
-  const CPDF_Array* pFonts = m_pFontDict->GetArrayFor("DescendantFonts");
+  RetainPtr<const CPDF_Array> pFonts =
+      m_pFontDict->GetArrayFor("DescendantFonts");
   if (!pFonts || pFonts->size() != 1)
     return false;
 
@@ -471,9 +472,11 @@
       FT_UseCIDCharmap(m_Font.GetFaceRec(), m_pCMap->GetCoding());
   }
   m_DefaultWidth = pCIDFontDict->GetIntegerFor("DW", 1000);
-  const CPDF_Array* pWidthArray = pCIDFontDict->GetArrayFor("W");
-  if (pWidthArray)
-    LoadMetricsArray(pWidthArray, &m_WidthList, 1);
+  RetainPtr<const CPDF_Array> pWidthArray = pCIDFontDict->GetArrayFor("W");
+  if (pWidthArray) {
+    // TODO(tsepez): pass retained argument.
+    LoadMetricsArray(pWidthArray.Get(), &m_WidthList, 1);
+  }
   if (!IsEmbedded())
     LoadSubstFont();
 
@@ -492,10 +495,13 @@
 
   CheckFontMetrics();
   if (IsVertWriting()) {
-    pWidthArray = pCIDFontDict->GetArrayFor("W2");
-    if (pWidthArray)
-      LoadMetricsArray(pWidthArray, &m_VertMetrics, 3);
-    const CPDF_Array* pDefaultArray = pCIDFontDict->GetArrayFor("DW2");
+    RetainPtr<const CPDF_Array> pWidth2Array = pCIDFontDict->GetArrayFor("W2");
+    if (pWidth2Array) {
+      // TODO(tsepez): pass retained argument.
+      LoadMetricsArray(pWidth2Array.Get(), &m_VertMetrics, 3);
+    }
+    RetainPtr<const CPDF_Array> pDefaultArray =
+        pCIDFontDict->GetArrayFor("DW2");
     if (pDefaultArray) {
       m_DefaultVY = pDefaultArray->GetIntegerAt(0);
       m_DefaultW1 = pDefaultArray->GetIntegerAt(1);
diff --git a/core/fpdfapi/font/cpdf_font.cpp b/core/fpdfapi/font/cpdf_font.cpp
index f746e47..0aac03f 100644
--- a/core/fpdfapi/font/cpdf_font.cpp
+++ b/core/fpdfapi/font/cpdf_font.cpp
@@ -194,7 +194,7 @@
   }
   if (m_Descent > 10)
     m_Descent = -m_Descent;
-  const CPDF_Array* pBBox = pFontDesc->GetArrayFor("FontBBox");
+  RetainPtr<const CPDF_Array> pBBox = pFontDesc->GetArrayFor("FontBBox");
   if (pBBox) {
     m_FontBBox.left = pBBox->GetIntegerAt(0);
     m_FontBBox.bottom = pBBox->GetIntegerAt(1);
diff --git a/core/fpdfapi/font/cpdf_simplefont.cpp b/core/fpdfapi/font/cpdf_simplefont.cpp
index 9d1939c..af10611 100644
--- a/core/fpdfapi/font/cpdf_simplefont.cpp
+++ b/core/fpdfapi/font/cpdf_simplefont.cpp
@@ -105,7 +105,7 @@
 }
 
 void CPDF_SimpleFont::LoadCharWidths(const CPDF_Dictionary* font_desc) {
-  const CPDF_Array* width_array = m_pFontDict->GetArrayFor("Widths");
+  RetainPtr<const CPDF_Array> width_array = m_pFontDict->GetArrayFor("Widths");
   m_bUseFontWidth = !width_array;
   if (!width_array)
     return;
@@ -129,7 +129,7 @@
 }
 
 void CPDF_SimpleFont::LoadDifferences(const CPDF_Dictionary* encoding) {
-  const CPDF_Array* diffs = encoding->GetArrayFor("Differences");
+  RetainPtr<const CPDF_Array> diffs = encoding->GetArrayFor("Differences");
   if (!diffs)
     return;
 
diff --git a/core/fpdfapi/font/cpdf_type3font.cpp b/core/fpdfapi/font/cpdf_type3font.cpp
index ea7caaf..1d4f76d 100644
--- a/core/fpdfapi/font/cpdf_type3font.cpp
+++ b/core/fpdfapi/font/cpdf_type3font.cpp
@@ -58,7 +58,7 @@
 
 bool CPDF_Type3Font::Load() {
   m_pFontResources = m_pFontDict->GetMutableDictFor("Resources");
-  const CPDF_Array* pMatrix = m_pFontDict->GetArrayFor("FontMatrix");
+  RetainPtr<const CPDF_Array> pMatrix = m_pFontDict->GetArrayFor("FontMatrix");
   float xscale = 1.0f;
   float yscale = 1.0f;
   if (pMatrix) {
@@ -67,7 +67,7 @@
     yscale = m_FontMatrix.d;
   }
 
-  const CPDF_Array* pBBox = m_pFontDict->GetArrayFor("FontBBox");
+  RetainPtr<const CPDF_Array> pBBox = m_pFontDict->GetArrayFor("FontBBox");
   if (pBBox) {
     CFX_FloatRect box(
         pBBox->GetFloatAt(0) * xscale, pBBox->GetFloatAt(1) * yscale,
@@ -79,7 +79,8 @@
   static constexpr size_t kCharLimit = std::extent<decltype(m_CharWidthL)>();
   int StartChar = m_pFontDict->GetIntegerFor("FirstChar");
   if (StartChar >= 0 && static_cast<size_t>(StartChar) < kCharLimit) {
-    const CPDF_Array* pWidthArray = m_pFontDict->GetArrayFor("Widths");
+    RetainPtr<const CPDF_Array> pWidthArray =
+        m_pFontDict->GetArrayFor("Widths");
     if (pWidthArray) {
       size_t count = std::min(pWidthArray->size(), kCharLimit);
       count = std::min(count, kCharLimit - StartChar);
diff --git a/core/fpdfapi/page/cpdf_colorspace.cpp b/core/fpdfapi/page/cpdf_colorspace.cpp
index 34c18cf..e0a56c1 100644
--- a/core/fpdfapi/page/cpdf_colorspace.cpp
+++ b/core/fpdfapi/page/cpdf_colorspace.cpp
@@ -89,7 +89,7 @@
 }
 
 void GetBlackPoint(const CPDF_Dictionary* pDict, float* pPoints) {
-  const CPDF_Array* pParam = pDict->GetArrayFor("BlackPoint");
+  RetainPtr<const CPDF_Array> pParam = pDict->GetArrayFor("BlackPoint");
   if (!pParam || pParam->size() != kBlackWhitePointCount) {
     GetDefaultBlackPoint(pPoints);
     return;
@@ -106,7 +106,7 @@
 }
 
 bool GetWhitePoint(const CPDF_Dictionary* pDict, float* pPoints) {
-  const CPDF_Array* pParam = pDict->GetArrayFor("WhitePoint");
+  RetainPtr<const CPDF_Array> pParam = pDict->GetArrayFor("WhitePoint");
   if (!pParam || pParam->size() != kBlackWhitePointCount)
     return false;
 
@@ -705,18 +705,18 @@
 
   GetBlackPoint(pDict.Get(), m_BlackPoint);
 
-  const CPDF_Array* pParam = pDict->GetArrayFor("Gamma");
-  if (pParam) {
+  RetainPtr<const CPDF_Array> pGamma = pDict->GetArrayFor("Gamma");
+  if (pGamma) {
     m_bHasGamma = true;
     for (size_t i = 0; i < std::size(m_Gamma); ++i)
-      m_Gamma[i] = pParam->GetFloatAt(i);
+      m_Gamma[i] = pGamma->GetFloatAt(i);
   }
 
-  pParam = pDict->GetArrayFor("Matrix");
-  if (pParam) {
+  RetainPtr<const CPDF_Array> pMatrix = pDict->GetArrayFor("Matrix");
+  if (pMatrix) {
     m_bHasMatrix = true;
     for (size_t i = 0; i < std::size(m_Matrix); ++i)
-      m_Matrix[i] = pParam->GetFloatAt(i);
+      m_Matrix[i] = pMatrix->GetFloatAt(i);
   }
   return 3;
 }
@@ -819,7 +819,7 @@
 
   GetBlackPoint(pDict.Get(), m_BlackPoint);
 
-  const CPDF_Array* pParam = pDict->GetArrayFor("Range");
+  RetainPtr<const CPDF_Array> pParam = pDict->GetArrayFor("Range");
   static constexpr float kDefaultRanges[kRangesCount] = {-100.0f, 100.0f,
                                                          -100.0f, 100.0f};
   static_assert(std::size(kDefaultRanges) == std::extent<decltype(m_Ranges)>(),
@@ -1081,9 +1081,9 @@
 std::vector<float> CPDF_ICCBasedCS::GetRanges(const CPDF_Dictionary* pDict,
                                               uint32_t nComponents) {
   DCHECK(IsValidIccComponents(nComponents));
-  const CPDF_Array* pRanges = pDict->GetArrayFor("Range");
+  RetainPtr<const CPDF_Array> pRanges = pDict->GetArrayFor("Range");
   if (pRanges && pRanges->size() >= nComponents * 2)
-    return ReadArrayElementsToVector(pRanges, nComponents * 2);
+    return ReadArrayElementsToVector(pRanges.Get(), nComponents * 2);
 
   std::vector<float> ranges;
   ranges.reserve(nComponents * 2);
diff --git a/core/fpdfapi/page/cpdf_contentparser.cpp b/core/fpdfapi/page/cpdf_contentparser.cpp
index d830143..282c1e3 100644
--- a/core/fpdfapi/page/cpdf_contentparser.cpp
+++ b/core/fpdfapi/page/cpdf_contentparser.cpp
@@ -76,7 +76,7 @@
   if (pGraphicStates)
     form_matrix.Concat(pGraphicStates->m_CTM);
 
-  const CPDF_Array* pBBox = pForm->GetDict()->GetArrayFor("BBox");
+  RetainPtr<const CPDF_Array> pBBox = pForm->GetDict()->GetArrayFor("BBox");
   CFX_FloatRect form_bbox;
   CPDF_Path ClipPath;
   if (pBBox) {
@@ -148,7 +148,7 @@
 CPDF_ContentParser::Stage CPDF_ContentParser::GetContent() {
   DCHECK_EQ(m_CurrentStage, Stage::kGetContent);
   DCHECK(m_pObjectHolder->IsPage());
-  const CPDF_Array* pContent =
+  RetainPtr<const CPDF_Array> pContent =
       m_pObjectHolder->GetDict()->GetArrayFor(pdfium::page_object::kContents);
   RetainPtr<const CPDF_Stream> pStreamObj = ToStream(
       pContent ? pContent->GetDirectObjectAt(m_CurrentOffset) : nullptr);
diff --git a/core/fpdfapi/page/cpdf_dib.cpp b/core/fpdfapi/page/cpdf_dib.cpp
index c890ad4..a11307c 100644
--- a/core/fpdfapi/page/cpdf_dib.cpp
+++ b/core/fpdfapi/page/cpdf_dib.cpp
@@ -339,7 +339,7 @@
     }
     m_bImageMask = true;
     m_bpc = m_nComponents = 1;
-    const CPDF_Array* pDecode = m_pDict->GetArrayFor("Decode");
+    RetainPtr<const CPDF_Array> pDecode = m_pDict->GetArrayFor("Decode");
     m_bDefaultDecode = !pDecode || !pDecode->GetIntegerAt(0);
     return true;
   }
@@ -389,7 +389,7 @@
 
   m_CompData.resize(m_nComponents);
   int max_data = (1 << m_bpc) - 1;
-  const CPDF_Array* pDecode = m_pDict->GetArrayFor("Decode");
+  RetainPtr<const CPDF_Array> pDecode = m_pDict->GetArrayFor("Decode");
   if (pDecode) {
     for (uint32_t i = 0; i < m_nComponents; i++) {
       m_CompData[i].m_DecodeMin = pDecode->GetFloatAt(i * 2);
@@ -756,13 +756,13 @@
     return mask ? StartLoadMaskDIB(std::move(mask)) : LoadState::kSuccess;
   }
 
-  const CPDF_Array* pMatte = mask->GetDict()->GetArrayFor("Matte");
+  RetainPtr<const CPDF_Array> pMatte = mask->GetDict()->GetArrayFor("Matte");
   if (pMatte && m_pColorSpace &&
       m_Family != CPDF_ColorSpace::Family::kPattern &&
       pMatte->size() == m_nComponents &&
       m_pColorSpace->CountComponents() <= m_nComponents) {
     std::vector<float> colors =
-        ReadArrayElementsToVector(pMatte, m_nComponents);
+        ReadArrayElementsToVector(pMatte.Get(), m_nComponents);
 
     float R;
     float G;
diff --git a/core/fpdfapi/page/cpdf_expintfunc.cpp b/core/fpdfapi/page/cpdf_expintfunc.cpp
index 798de32..93de2d5 100644
--- a/core/fpdfapi/page/cpdf_expintfunc.cpp
+++ b/core/fpdfapi/page/cpdf_expintfunc.cpp
@@ -33,13 +33,13 @@
 
   m_Exponent = pExponent->GetNumber();
 
-  const CPDF_Array* pArray0 = pDict->GetArrayFor("C0");
+  RetainPtr<const CPDF_Array> pArray0 = pDict->GetArrayFor("C0");
   if (pArray0 && m_nOutputs == 0)
     m_nOutputs = fxcrt::CollectionSize<uint32_t>(*pArray0);
   if (m_nOutputs == 0)
     m_nOutputs = 1;
 
-  const CPDF_Array* pArray1 = pDict->GetArrayFor("C1");
+  RetainPtr<const CPDF_Array> pArray1 = pDict->GetArrayFor("C1");
   m_BeginValues = DataVector<float>(Fx2DSizeOrDie(m_nOutputs, 2));
   m_EndValues = DataVector<float>(m_BeginValues.size());
   for (uint32_t i = 0; i < m_nOutputs; i++) {
diff --git a/core/fpdfapi/page/cpdf_function.cpp b/core/fpdfapi/page/cpdf_function.cpp
index f3c3a3f..03e9afc 100644
--- a/core/fpdfapi/page/cpdf_function.cpp
+++ b/core/fpdfapi/page/cpdf_function.cpp
@@ -89,7 +89,7 @@
   RetainPtr<const CPDF_Dictionary> pDict =
       pStream ? pStream->GetDict() : pdfium::WrapRetain(pObj->AsDictionary());
 
-  const CPDF_Array* pDomains = pDict->GetArrayFor("Domain");
+  RetainPtr<const CPDF_Array> pDomains = pDict->GetArrayFor("Domain");
   if (!pDomains)
     return false;
 
@@ -98,9 +98,9 @@
     return false;
 
   size_t nInputs = m_nInputs * 2;
-  m_Domains = ReadArrayElementsToVector(pDomains, nInputs);
+  m_Domains = ReadArrayElementsToVector(pDomains.Get(), nInputs);
 
-  const CPDF_Array* pRanges = pDict->GetArrayFor("Range");
+  RetainPtr<const CPDF_Array> pRanges = pDict->GetArrayFor("Range");
   m_nOutputs = pRanges ? fxcrt::CollectionSize<uint32_t>(*pRanges) / 2 : 0;
 
   // Ranges are required for type 0 and type 4 functions. A non-zero
@@ -112,7 +112,7 @@
 
   if (m_nOutputs > 0) {
     size_t nOutputs = m_nOutputs * 2;
-    m_Ranges = ReadArrayElementsToVector(pRanges, nOutputs);
+    m_Ranges = ReadArrayElementsToVector(pRanges.Get(), nOutputs);
   }
 
   uint32_t old_outputs = m_nOutputs;
diff --git a/core/fpdfapi/page/cpdf_meshstream.cpp b/core/fpdfapi/page/cpdf_meshstream.cpp
index 0f10db6..c3f0135 100644
--- a/core/fpdfapi/page/cpdf_meshstream.cpp
+++ b/core/fpdfapi/page/cpdf_meshstream.cpp
@@ -132,7 +132,7 @@
     return false;
 
   m_nComponents = m_funcs.empty() ? nComponents : 1;
-  const CPDF_Array* pDecode = pDict->GetArrayFor("Decode");
+  RetainPtr<const CPDF_Array> pDecode = pDict->GetArrayFor("Decode");
   if (!pDecode || pDecode->size() != 4 + m_nComponents * 2)
     return false;
 
diff --git a/core/fpdfapi/page/cpdf_occontext.cpp b/core/fpdfapi/page/cpdf_occontext.cpp
index 442bb2d..efcf167 100644
--- a/core/fpdfapi/page/cpdf_occontext.cpp
+++ b/core/fpdfapi/page/cpdf_occontext.cpp
@@ -42,7 +42,7 @@
   if (!pOCProperties)
     return nullptr;
 
-  const CPDF_Array* pOCGs = pOCProperties->GetArrayFor("OCGs");
+  RetainPtr<const CPDF_Array> pOCGs = pOCProperties->GetArrayFor("OCGs");
   if (!pOCGs)
     return nullptr;
 
@@ -50,7 +50,7 @@
     return nullptr;
 
   const CPDF_Dictionary* pConfig = pOCProperties->GetDictFor("D");
-  const CPDF_Array* pConfigs = pOCProperties->GetArrayFor("Configs");
+  RetainPtr<const CPDF_Array> pConfigs = pOCProperties->GetArrayFor("Configs");
   if (!pConfigs)
     return pConfig;
 
@@ -98,7 +98,7 @@
     return true;
 
   bool bState = pConfig->GetByteStringFor("BaseState", "ON") != "OFF";
-  const CPDF_Array* pArray = pConfig->GetArrayFor("ON");
+  RetainPtr<const CPDF_Array> pArray = pConfig->GetArrayFor("ON");
   if (pArray && pArray->Contains(pOCGDict))
     bState = true;
 
@@ -119,7 +119,7 @@
     if (pUsage->GetByteStringFor("Event", "View") != csConfig)
       continue;
 
-    const CPDF_Array* pOCGs = pUsage->GetArrayFor("OCGs");
+    RetainPtr<const CPDF_Array> pOCGs = pUsage->GetArrayFor("OCGs");
     if (!pOCGs)
       continue;
 
@@ -228,9 +228,11 @@
 }
 
 bool CPDF_OCContext::LoadOCMDState(const CPDF_Dictionary* pOCMDDict) const {
-  const CPDF_Array* pVE = pOCMDDict->GetArrayFor("VE");
-  if (pVE)
-    return GetOCGVE(pVE, 0);
+  RetainPtr<const CPDF_Array> pVE = pOCMDDict->GetArrayFor("VE");
+  if (pVE) {
+    // TODO(tsepez): pass retained argument.
+    return GetOCGVE(pVE.Get(), 0);
+  }
 
   ByteString csP = pOCMDDict->GetByteStringFor("P", "AnyOn");
   RetainPtr<const CPDF_Object> pOCGObj = pOCMDDict->GetDirectObjectFor("OCGs");
diff --git a/core/fpdfapi/page/cpdf_sampledfunc.cpp b/core/fpdfapi/page/cpdf_sampledfunc.cpp
index 0911647..3f57286 100644
--- a/core/fpdfapi/page/cpdf_sampledfunc.cpp
+++ b/core/fpdfapi/page/cpdf_sampledfunc.cpp
@@ -49,7 +49,7 @@
     return false;
 
   RetainPtr<const CPDF_Dictionary> pDict = pStream->GetDict();
-  const CPDF_Array* pSize = pDict->GetArrayFor("Size");
+  RetainPtr<const CPDF_Array> pSize = pDict->GetArrayFor("Size");
   if (!pSize || pSize->IsEmpty())
     return false;
 
@@ -59,7 +59,7 @@
 
   FX_SAFE_UINT32 nTotalSampleBits = m_nBitsPerSample;
   nTotalSampleBits *= m_nOutputs;
-  const CPDF_Array* pEncode = pDict->GetArrayFor("Encode");
+  RetainPtr<const CPDF_Array> pEncode = pDict->GetArrayFor("Encode");
   m_EncodeInfo.resize(m_nInputs);
   for (uint32_t i = 0; i < m_nInputs; i++) {
     int size = pSize->GetIntegerAt(i);
@@ -87,7 +87,7 @@
   if (nTotalSampleBytes.ValueOrDie() > m_pSampleStream->GetSize())
     return false;
 
-  const CPDF_Array* pDecode = pDict->GetArrayFor("Decode");
+  RetainPtr<const CPDF_Array> pDecode = pDict->GetArrayFor("Decode");
   m_DecodeInfo.resize(m_nOutputs);
   for (uint32_t i = 0; i < m_nOutputs; i++) {
     if (pDecode) {
diff --git a/core/fpdfapi/page/cpdf_stitchfunc.cpp b/core/fpdfapi/page/cpdf_stitchfunc.cpp
index d2d18f0..d28113e 100644
--- a/core/fpdfapi/page/cpdf_stitchfunc.cpp
+++ b/core/fpdfapi/page/cpdf_stitchfunc.cpp
@@ -33,15 +33,15 @@
   if (!pDict)
     return false;
 
-  const CPDF_Array* pFunctionsArray = pDict->GetArrayFor("Functions");
+  RetainPtr<const CPDF_Array> pFunctionsArray = pDict->GetArrayFor("Functions");
   if (!pFunctionsArray)
     return false;
 
-  const CPDF_Array* pBoundsArray = pDict->GetArrayFor("Bounds");
+  RetainPtr<const CPDF_Array> pBoundsArray = pDict->GetArrayFor("Bounds");
   if (!pBoundsArray)
     return false;
 
-  const CPDF_Array* pEncodeArray = pDict->GetArrayFor("Encode");
+  RetainPtr<const CPDF_Array> pEncodeArray = pDict->GetArrayFor("Encode");
   if (!pEncodeArray)
     return false;
 
@@ -103,7 +103,7 @@
     m_bounds.push_back(pBoundsArray->GetFloatAt(i));
   m_bounds.push_back(m_Domains[1]);
 
-  m_encode = ReadArrayElementsToVector(pEncodeArray, nSubs * 2);
+  m_encode = ReadArrayElementsToVector(pEncodeArray.Get(), nSubs * 2);
   return true;
 }
 
diff --git a/core/fpdfapi/page/cpdf_streamparser.cpp b/core/fpdfapi/page/cpdf_streamparser.cpp
index da58c04..83291b8 100644
--- a/core/fpdfapi/page/cpdf_streamparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamparser.cpp
@@ -145,7 +145,7 @@
     const CPDF_Array* pArray = pFilter->AsArray();
     if (pArray) {
       decoder = pArray->GetByteStringAt(0);
-      const CPDF_Array* pParams =
+      RetainPtr<const CPDF_Array> pParams =
           pDict->GetArrayFor(pdfium::stream::kDecodeParms);
       if (pParams)
         pParam = pParams->GetDictAt(0);
diff --git a/core/fpdfapi/parser/cpdf_dictionary.cpp b/core/fpdfapi/parser/cpdf_dictionary.cpp
index 2246d7a..33f814b 100644
--- a/core/fpdfapi/parser/cpdf_dictionary.cpp
+++ b/core/fpdfapi/parser/cpdf_dictionary.cpp
@@ -190,8 +190,9 @@
   return ToArray(GetDirectObjectForInternal(key));
 }
 
-const CPDF_Array* CPDF_Dictionary::GetArrayFor(const ByteString& key) const {
-  return GetArrayForInternal(key);
+RetainPtr<const CPDF_Array> CPDF_Dictionary::GetArrayFor(
+    const ByteString& key) const {
+  return pdfium::WrapRetain(GetArrayForInternal(key));
 }
 
 RetainPtr<CPDF_Array> CPDF_Dictionary::GetMutableArrayFor(
@@ -244,19 +245,17 @@
 }
 
 CFX_FloatRect CPDF_Dictionary::GetRectFor(const ByteString& key) const {
-  CFX_FloatRect rect;
-  const CPDF_Array* pArray = GetArrayFor(key);
+  const CPDF_Array* pArray = GetArrayForInternal(key);
   if (pArray)
-    rect = pArray->GetRect();
-  return rect;
+    return pArray->GetRect();
+  return CFX_FloatRect();
 }
 
 CFX_Matrix CPDF_Dictionary::GetMatrixFor(const ByteString& key) const {
-  CFX_Matrix matrix;
-  const CPDF_Array* pArray = GetArrayFor(key);
+  const CPDF_Array* pArray = GetArrayForInternal(key);
   if (pArray)
-    matrix = pArray->GetMatrix();
-  return matrix;
+    return pArray->GetMatrix();
+  return CFX_Matrix();
 }
 
 bool CPDF_Dictionary::KeyExist(const ByteString& key) const {
diff --git a/core/fpdfapi/parser/cpdf_dictionary.h b/core/fpdfapi/parser/cpdf_dictionary.h
index a80dda5..e0e3e5d 100644
--- a/core/fpdfapi/parser/cpdf_dictionary.h
+++ b/core/fpdfapi/parser/cpdf_dictionary.h
@@ -69,7 +69,7 @@
   const CPDF_Dictionary* GetDictFor(const ByteString& key) const;
   RetainPtr<CPDF_Dictionary> GetMutableDictFor(const ByteString& key);
   RetainPtr<CPDF_Dictionary> GetOrCreateDictFor(const ByteString& key);
-  const CPDF_Array* GetArrayFor(const ByteString& key) const;
+  RetainPtr<const CPDF_Array> GetArrayFor(const ByteString& key) const;
   RetainPtr<CPDF_Array> GetMutableArrayFor(const ByteString& key);
   RetainPtr<CPDF_Array> GetOrCreateArrayFor(const ByteString& key);
   RetainPtr<const CPDF_Stream> GetStreamFor(const ByteString& key) const;
diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp
index c966745..59e6f71 100644
--- a/core/fpdfapi/parser/cpdf_document.cpp
+++ b/core/fpdfapi/parser/cpdf_document.cpp
@@ -69,7 +69,7 @@
     return -1;
   }
 
-  const CPDF_Array* pKidList = pNode->GetArrayFor("Kids");
+  RetainPtr<const CPDF_Array> pKidList = pNode->GetArrayFor("Kids");
   if (!pKidList)
     return -1;
 
diff --git a/core/fpdfapi/parser/cpdf_linearized_header.cpp b/core/fpdfapi/parser/cpdf_linearized_header.cpp
index adedf3b..115e2f6 100644
--- a/core/fpdfapi/parser/cpdf_linearized_header.cpp
+++ b/core/fpdfapi/parser/cpdf_linearized_header.cpp
@@ -95,7 +95,7 @@
       m_szFirstPageEndOffset(pDict->GetIntegerFor("E")),
       m_FirstPageObjNum(pDict->GetIntegerFor("O")),
       m_szLastXRefOffset(szLastXRefOffset) {
-  const CPDF_Array* pHintStreamRange = pDict->GetArrayFor("H");
+  RetainPtr<const CPDF_Array> pHintStreamRange = pDict->GetArrayFor("H");
   const size_t nHintStreamSize =
       pHintStreamRange ? pHintStreamRange->size() : 0;
   if (nHintStreamSize == 2 || nHintStreamSize == 4) {
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp
index 3eac803..e7751e3 100644
--- a/core/fpdfapi/parser/cpdf_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_parser.cpp
@@ -752,9 +752,10 @@
   }
 
   std::vector<CrossRefV5IndexEntry> indices =
-      GetCrossRefV5Indices(pDict->GetArrayFor("Index"), size);
+      GetCrossRefV5Indices(pDict->GetArrayFor("Index").Get(), size);
 
-  std::vector<uint32_t> field_widths = GetFieldWidths(pDict->GetArrayFor("W"));
+  std::vector<uint32_t> field_widths =
+      GetFieldWidths(pDict->GetArrayFor("W").Get());
   if (field_widths.size() < kMinFieldCount)
     return false;
 
@@ -850,8 +851,9 @@
   m_CrossRefTable->AddCompressed(obj_num, archive_obj_num, archive_obj_index);
 }
 
+// TODO(tsepez): return retained object.
 const CPDF_Array* CPDF_Parser::GetIDArray() const {
-  return GetTrailer() ? GetTrailer()->GetArrayFor("ID") : nullptr;
+  return GetTrailer() ? GetTrailer()->GetArrayFor("ID").Get() : nullptr;
 }
 
 // TODO(tsepez): return retained object, though not clear if it can change.
diff --git a/core/fpdfapi/render/cpdf_rendershading.cpp b/core/fpdfapi/render/cpdf_rendershading.cpp
index 266e2fa..ba06563 100644
--- a/core/fpdfapi/render/cpdf_rendershading.cpp
+++ b/core/fpdfapi/render/cpdf_rendershading.cpp
@@ -102,7 +102,7 @@
   if (total_results == 0)
     return;
 
-  const CPDF_Array* pCoords = pDict->GetArrayFor("Coords");
+  RetainPtr<const CPDF_Array> pCoords = pDict->GetArrayFor("Coords");
   if (!pCoords)
     return;
 
@@ -112,7 +112,7 @@
   float end_y = pCoords->GetFloatAt(3);
   float t_min = 0;
   float t_max = 1.0f;
-  const CPDF_Array* pArray = pDict->GetArrayFor("Domain");
+  RetainPtr<const CPDF_Array> pArray = pDict->GetArrayFor("Domain");
   if (pArray) {
     t_min = pArray->GetFloatAt(0);
     t_max = pArray->GetFloatAt(1);
@@ -169,7 +169,7 @@
   if (total_results == 0)
     return;
 
-  const CPDF_Array* pCoords = pDict->GetArrayFor("Coords");
+  RetainPtr<const CPDF_Array> pCoords = pDict->GetArrayFor("Coords");
   if (!pCoords)
     return;
 
@@ -181,7 +181,7 @@
   float end_r = pCoords->GetFloatAt(5);
   float t_min = 0;
   float t_max = 1.0f;
-  const CPDF_Array* pArray = pDict->GetArrayFor("Domain");
+  RetainPtr<const CPDF_Array> pArray = pDict->GetArrayFor("Domain");
   if (pArray) {
     t_min = pArray->GetFloatAt(0);
     t_max = pArray->GetFloatAt(1);
@@ -265,7 +265,7 @@
   if (total_results == 0)
     return;
 
-  const CPDF_Array* pDomain = pDict->GetArrayFor("Domain");
+  RetainPtr<const CPDF_Array> pDomain = pDict->GetArrayFor("Domain");
   float xmin = 0.0f;
   float ymin = 0.0f;
   float xmax = 1.0f;
@@ -885,10 +885,10 @@
 
   FX_ARGB background = 0;
   if (!pPattern->IsShadingObject() && pDict->KeyExist("Background")) {
-    const CPDF_Array* pBackColor = pDict->GetArrayFor("Background");
+    RetainPtr<const CPDF_Array> pBackColor = pDict->GetArrayFor("Background");
     if (pBackColor && pBackColor->size() >= pColorSpace->CountComponents()) {
-      std::vector<float> comps =
-          ReadArrayElementsToVector(pBackColor, pColorSpace->CountComponents());
+      std::vector<float> comps = ReadArrayElementsToVector(
+          pBackColor.Get(), pColorSpace->CountComponents());
 
       float R = 0.0f;
       float G = 0.0f;
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index c7a3a16..4d8a67c 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -1496,7 +1496,8 @@
                                         const CPDF_Dictionary* pGroupDict,
                                         CPDF_ColorSpace::Family* pCSFamily) {
   static constexpr FX_ARGB kDefaultColor = ArgbEncode(255, 0, 0, 0);
-  const CPDF_Array* pBC = pSMaskDict->GetArrayFor(pdfium::transparency::kBC);
+  RetainPtr<const CPDF_Array> pBC =
+      pSMaskDict->GetArrayFor(pdfium::transparency::kBC);
   if (!pBC)
     return kDefaultColor;
 
@@ -1522,7 +1523,7 @@
 
   uint32_t comps = std::max(8u, pCS->CountComponents());
   size_t count = std::min<size_t>(8, pBC->size());
-  std::vector<float> floats = ReadArrayElementsToVector(pBC, count);
+  std::vector<float> floats = ReadArrayElementsToVector(pBC.Get(), count);
   floats.resize(comps);
 
   float R;
diff --git a/core/fpdfdoc/cpdf_action.cpp b/core/fpdfdoc/cpdf_action.cpp
index 769fde7..469243b 100644
--- a/core/fpdfdoc/cpdf_action.cpp
+++ b/core/fpdfdoc/cpdf_action.cpp
@@ -118,14 +118,15 @@
     return result;
 
   ByteString csType = m_pDict->GetByteStringFor("S");
-  const CPDF_Object* pFields = csType == "Hide"
-                                   ? m_pDict->GetDirectObjectFor("T").Get()
-                                   : m_pDict->GetArrayFor("Fields");
+  RetainPtr<const CPDF_Object> pFields = csType == "Hide"
+                                             ? m_pDict->GetDirectObjectFor("T")
+                                             : m_pDict->GetArrayFor("Fields");
   if (!pFields)
     return result;
 
   if (pFields->IsDictionary() || pFields->IsString()) {
-    result.push_back(pFields);
+    // TODO(tsepez): push retained arguments.
+    result.push_back(pFields.Get());
   } else if (const CPDF_Array* pArray = pFields->AsArray()) {
     for (size_t i = 0; i < pArray->size(); ++i) {
       RetainPtr<const CPDF_Object> pObj = pArray->GetDirectObjectAt(i);
diff --git a/core/fpdfdoc/cpdf_annot.cpp b/core/fpdfdoc/cpdf_annot.cpp
index 0bc8564..472f709 100644
--- a/core/fpdfdoc/cpdf_annot.cpp
+++ b/core/fpdfdoc/cpdf_annot.cpp
@@ -229,14 +229,14 @@
 CFX_FloatRect CPDF_Annot::BoundingRectFromQuadPoints(
     const CPDF_Dictionary* pAnnotDict) {
   CFX_FloatRect ret;
-  const CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
-  size_t nQuadPointCount = pArray ? QuadPointCount(pArray) : 0;
+  RetainPtr<const CPDF_Array> pArray = pAnnotDict->GetArrayFor("QuadPoints");
+  size_t nQuadPointCount = pArray ? QuadPointCount(pArray.Get()) : 0;
   if (nQuadPointCount == 0)
     return ret;
 
-  ret = RectFromQuadPointsArray(pArray, 0);
+  ret = RectFromQuadPointsArray(pArray.Get(), 0);
   for (size_t i = 1; i < nQuadPointCount; ++i) {
-    CFX_FloatRect rect = RectFromQuadPointsArray(pArray, i);
+    CFX_FloatRect rect = RectFromQuadPointsArray(pArray.Get(), i);
     ret.Union(rect);
   }
   return ret;
@@ -245,11 +245,11 @@
 // static
 CFX_FloatRect CPDF_Annot::RectFromQuadPoints(const CPDF_Dictionary* pAnnotDict,
                                              size_t nIndex) {
-  const CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
-  size_t nQuadPointCount = pArray ? QuadPointCount(pArray) : 0;
+  RetainPtr<const CPDF_Array> pArray = pAnnotDict->GetArrayFor("QuadPoints");
+  size_t nQuadPointCount = pArray ? QuadPointCount(pArray.Get()) : 0;
   if (nIndex >= nQuadPointCount)
     return CFX_FloatRect();
-  return RectFromQuadPointsArray(pArray, nIndex);
+  return RectFromQuadPointsArray(pArray.Get(), nIndex);
 }
 
 // static
@@ -449,9 +449,9 @@
   const CPDF_Dictionary* pBS = m_pAnnotDict->GetDictFor("BS");
   char style_char;
   float width;
-  const CPDF_Array* pDashArray = nullptr;
+  RetainPtr<const CPDF_Array> pDashArray;
   if (!pBS) {
-    const CPDF_Array* pBorderArray =
+    RetainPtr<const CPDF_Array> pBorderArray =
         m_pAnnotDict->GetArrayFor(pdfium::annotation::kBorder);
     style_char = 'S';
     if (pBorderArray) {
@@ -487,7 +487,8 @@
   if (width <= 0) {
     return;
   }
-  const CPDF_Array* pColor = m_pAnnotDict->GetArrayFor(pdfium::annotation::kC);
+  RetainPtr<const CPDF_Array> pColor =
+      m_pAnnotDict->GetArrayFor(pdfium::annotation::kC);
   uint32_t argb = 0xff000000;
   if (pColor) {
     int R = static_cast<int32_t>(pColor->GetFloatAt(0) * 255);
@@ -506,7 +507,7 @@
   if (style_char == 'D') {
     if (pDashArray) {
       graph_state.m_DashArray =
-          ReadArrayElementsToVector(pDashArray, pDashArray->size());
+          ReadArrayElementsToVector(pDashArray.Get(), pDashArray->size());
       if (graph_state.m_DashArray.size() % 2)
         graph_state.m_DashArray.push_back(graph_state.m_DashArray.back());
     } else {
diff --git a/core/fpdfdoc/cpdf_apsettings.cpp b/core/fpdfdoc/cpdf_apsettings.cpp
index fa45551..039708d 100644
--- a/core/fpdfdoc/cpdf_apsettings.cpp
+++ b/core/fpdfdoc/cpdf_apsettings.cpp
@@ -34,7 +34,7 @@
   if (!m_pDict)
     return {CFX_Color::Type::kTransparent, 0};
 
-  const CPDF_Array* pEntry = m_pDict->GetArrayFor(csEntry);
+  RetainPtr<const CPDF_Array> pEntry = m_pDict->GetArrayFor(csEntry);
   if (!pEntry)
     return {CFX_Color::Type::kTransparent, 0};
 
@@ -68,7 +68,7 @@
   if (!m_pDict)
     return 0;
 
-  const CPDF_Array* pEntry = m_pDict->GetArrayFor(csEntry);
+  RetainPtr<const CPDF_Array> pEntry = m_pDict->GetArrayFor(csEntry);
   return pEntry ? pEntry->GetFloatAt(index) : 0;
 }
 
@@ -76,7 +76,7 @@
   if (!m_pDict)
     return CFX_Color();
 
-  const CPDF_Array* pEntry = m_pDict->GetArrayFor(csEntry);
+  RetainPtr<const CPDF_Array> pEntry = m_pDict->GetArrayFor(csEntry);
   if (!pEntry)
     return CFX_Color();
 
diff --git a/core/fpdfdoc/cpdf_generateap.cpp b/core/fpdfdoc/cpdf_generateap.cpp
index 442a0ea..afa5973 100644
--- a/core/fpdfdoc/cpdf_generateap.cpp
+++ b/core/fpdfdoc/cpdf_generateap.cpp
@@ -324,8 +324,7 @@
   if (pBorderStyleDict && pBorderStyleDict->KeyExist("W"))
     return pBorderStyleDict->GetFloatFor("W");
 
-  const CPDF_Array* pBorderArray =
-      pDict->GetArrayFor(pdfium::annotation::kBorder);
+  auto pBorderArray = pDict->GetArrayFor(pdfium::annotation::kBorder);
   if (pBorderArray && pBorderArray->size() > 2)
     return pBorderArray->GetFloatAt(2);
 
@@ -335,9 +334,9 @@
 RetainPtr<const CPDF_Array> GetDashArray(const CPDF_Dictionary* pDict) {
   const CPDF_Dictionary* pBorderStyleDict = pDict->GetDictFor("BS");
   if (pBorderStyleDict && pBorderStyleDict->GetByteStringFor("S") == "D")
-    return pdfium::WrapRetain(pBorderStyleDict->GetArrayFor("D"));
+    return pBorderStyleDict->GetArrayFor("D");
 
-  const CPDF_Array* pBorderArray =
+  RetainPtr<const CPDF_Array> pBorderArray =
       pDict->GetArrayFor(pdfium::annotation::kBorder);
   if (pBorderArray && pBorderArray->size() == 4)
     return pBorderArray->GetArrayAt(3);
@@ -529,13 +528,13 @@
   ByteString sExtGSDictName = "GS";
   sAppStream << "/" << sExtGSDictName << " gs ";
 
-  const CPDF_Array* pInteriorColor = pAnnotDict->GetArrayFor("IC");
+  RetainPtr<const CPDF_Array> pInteriorColor = pAnnotDict->GetArrayFor("IC");
   sAppStream << GetColorStringWithDefault(
-      pInteriorColor, CFX_Color(CFX_Color::Type::kTransparent),
+      pInteriorColor.Get(), CFX_Color(CFX_Color::Type::kTransparent),
       PaintOperation::kFill);
 
   sAppStream << GetColorStringWithDefault(
-      pAnnotDict->GetArrayFor(pdfium::annotation::kC),
+      pAnnotDict->GetArrayFor(pdfium::annotation::kC).Get(),
       CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke);
 
   float fBorderWidth = GetBorderWidth(pAnnotDict);
@@ -603,12 +602,12 @@
   sAppStream << "/" << sExtGSDictName << " gs ";
 
   sAppStream << GetColorStringWithDefault(
-      pAnnotDict->GetArrayFor(pdfium::annotation::kC),
+      pAnnotDict->GetArrayFor(pdfium::annotation::kC).Get(),
       CFX_Color(CFX_Color::Type::kRGB, 1, 1, 0), PaintOperation::kFill);
 
-  const CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
+  RetainPtr<const CPDF_Array> pArray = pAnnotDict->GetArrayFor("QuadPoints");
   if (pArray) {
-    size_t nQuadPointCount = CPDF_Annot::QuadPointCount(pArray);
+    size_t nQuadPointCount = CPDF_Annot::QuadPointCount(pArray.Get());
     for (size_t i = 0; i < nQuadPointCount; ++i) {
       CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict, i);
       rect.Normalize();
@@ -630,7 +629,7 @@
 }
 
 bool GenerateInkAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) {
-  const CPDF_Array* pInkList = pAnnotDict->GetArrayFor("InkList");
+  RetainPtr<const CPDF_Array> pInkList = pAnnotDict->GetArrayFor("InkList");
   if (!pInkList || pInkList->IsEmpty())
     return false;
 
@@ -643,7 +642,7 @@
   fxcrt::ostringstream sAppStream;
   sAppStream << "/" << sExtGSDictName << " gs ";
   sAppStream << GetColorStringWithDefault(
-      pAnnotDict->GetArrayFor(pdfium::annotation::kC),
+      pAnnotDict->GetArrayFor(pdfium::annotation::kC).Get(),
       CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke);
 
   sAppStream << fBorderWidth << " w ";
@@ -708,14 +707,14 @@
   sAppStream << "/" << sExtGSDictName << " gs ";
 
   sAppStream << GetColorStringWithDefault(
-      pAnnotDict->GetArrayFor(pdfium::annotation::kC),
+      pAnnotDict->GetArrayFor(pdfium::annotation::kC).Get(),
       CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke);
 
-  const CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
+  RetainPtr<const CPDF_Array> pArray = pAnnotDict->GetArrayFor("QuadPoints");
   if (pArray) {
     static constexpr float kLineWidth = 1.0f;
     sAppStream << kLineWidth << " w ";
-    size_t nQuadPointCount = CPDF_Annot::QuadPointCount(pArray);
+    size_t nQuadPointCount = CPDF_Annot::QuadPointCount(pArray.Get());
     for (size_t i = 0; i < nQuadPointCount; ++i) {
       CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict, i);
       rect.Normalize();
@@ -779,13 +778,13 @@
   fxcrt::ostringstream sAppStream;
   sAppStream << "/" << sExtGSDictName << " gs ";
 
-  const CPDF_Array* pInteriorColor = pAnnotDict->GetArrayFor("IC");
+  RetainPtr<const CPDF_Array> pInteriorColor = pAnnotDict->GetArrayFor("IC");
   sAppStream << GetColorStringWithDefault(
-      pInteriorColor, CFX_Color(CFX_Color::Type::kTransparent),
+      pInteriorColor.Get(), CFX_Color(CFX_Color::Type::kTransparent),
       PaintOperation::kFill);
 
   sAppStream << GetColorStringWithDefault(
-      pAnnotDict->GetArrayFor(pdfium::annotation::kC),
+      pAnnotDict->GetArrayFor(pdfium::annotation::kC).Get(),
       CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke);
 
   float fBorderWidth = GetBorderWidth(pAnnotDict);
@@ -825,15 +824,15 @@
   sAppStream << "/" << sExtGSDictName << " gs ";
 
   sAppStream << GetColorStringWithDefault(
-      pAnnotDict->GetArrayFor(pdfium::annotation::kC),
+      pAnnotDict->GetArrayFor(pdfium::annotation::kC).Get(),
       CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke);
 
-  const CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
+  RetainPtr<const CPDF_Array> pArray = pAnnotDict->GetArrayFor("QuadPoints");
   if (pArray) {
     static constexpr float kLineWidth = 1.0f;
     static constexpr float kDelta = 2.0f;
     sAppStream << kLineWidth << " w ";
-    size_t nQuadPointCount = CPDF_Annot::QuadPointCount(pArray);
+    size_t nQuadPointCount = CPDF_Annot::QuadPointCount(pArray.Get());
     for (size_t i = 0; i < nQuadPointCount; ++i) {
       CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict, i);
       rect.Normalize();
@@ -875,13 +874,13 @@
   sAppStream << "/" << sExtGSDictName << " gs ";
 
   sAppStream << GetColorStringWithDefault(
-      pAnnotDict->GetArrayFor(pdfium::annotation::kC),
+      pAnnotDict->GetArrayFor(pdfium::annotation::kC).Get(),
       CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke);
 
-  const CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
+  RetainPtr<const CPDF_Array> pArray = pAnnotDict->GetArrayFor("QuadPoints");
   if (pArray) {
     static constexpr float kLineWidth = 1.0f;
-    size_t nQuadPointCount = CPDF_Annot::QuadPointCount(pArray);
+    size_t nQuadPointCount = CPDF_Annot::QuadPointCount(pArray.Get());
     for (size_t i = 0; i < nQuadPointCount; ++i) {
       CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict, i);
       rect.Normalize();
@@ -998,7 +997,7 @@
     if (pBSDict->KeyExist("W"))
       fBorderWidth = pBSDict->GetFloatFor("W");
 
-    if (const CPDF_Array* pArray = pBSDict->GetArrayFor("D")) {
+    if (RetainPtr<const CPDF_Array> pArray = pBSDict->GetArrayFor("D")) {
       dsBorder = CPVT_Dash(pArray->GetIntegerAt(0), pArray->GetIntegerAt(1),
                            pArray->GetIntegerAt(2));
     }
@@ -1031,7 +1030,8 @@
   CFX_Color crBorder;
   CFX_Color crBG;
   if (pMKDict) {
-    const CPDF_Array* pArray = pMKDict->GetArrayFor(pdfium::appearance::kBC);
+    RetainPtr<const CPDF_Array> pArray =
+        pMKDict->GetArrayFor(pdfium::appearance::kBC);
     if (pArray)
       crBorder = fpdfdoc::CFXColorFromArray(*pArray);
     pArray = pMKDict->GetArrayFor(pdfium::appearance::kBG);
diff --git a/core/fpdfdoc/cpdf_iconfit.cpp b/core/fpdfdoc/cpdf_iconfit.cpp
index cf8202f..d2154ef 100644
--- a/core/fpdfdoc/cpdf_iconfit.cpp
+++ b/core/fpdfdoc/cpdf_iconfit.cpp
@@ -48,7 +48,7 @@
   if (!m_pDict)
     return {fLeft, fBottom};
 
-  const CPDF_Array* pA = m_pDict->GetArrayFor("A");
+  RetainPtr<const CPDF_Array> pA = m_pDict->GetArrayFor("A");
   if (!pA)
     return {fLeft, fBottom};
 
@@ -68,7 +68,7 @@
   if (!m_pDict)
     return CFX_PointF();
 
-  const CPDF_Array* pA = m_pDict->GetArrayFor("A");
+  RetainPtr<const CPDF_Array> pA = m_pDict->GetArrayFor("A");
   if (!pA)
     return CFX_PointF();
 
diff --git a/core/fpdfdoc/cpdf_interactiveform.cpp b/core/fpdfdoc/cpdf_interactiveform.cpp
index cac1dde..7cbaa9a 100644
--- a/core/fpdfdoc/cpdf_interactiveform.cpp
+++ b/core/fpdfdoc/cpdf_interactiveform.cpp
@@ -621,7 +621,8 @@
     const CPDF_Page* pPage,
     const CFX_PointF& point,
     int* z_order) const {
-  const CPDF_Array* pAnnotList = pPage->GetDict()->GetArrayFor("Annots");
+  RetainPtr<const CPDF_Array> pAnnotList =
+      pPage->GetDict()->GetArrayFor("Annots");
   if (!pAnnotList)
     return nullptr;
 
@@ -661,7 +662,7 @@
   if (!m_pFormDict)
     return 0;
 
-  const CPDF_Array* pArray = m_pFormDict->GetArrayFor("CO");
+  RetainPtr<const CPDF_Array> pArray = m_pFormDict->GetArrayFor("CO");
   return pArray ? fxcrt::CollectionSize<int>(*pArray) : 0;
 }
 
@@ -669,7 +670,7 @@
   if (!m_pFormDict || index < 0)
     return nullptr;
 
-  const CPDF_Array* pArray = m_pFormDict->GetArrayFor("CO");
+  RetainPtr<const CPDF_Array> pArray = m_pFormDict->GetArrayFor("CO");
   if (!pArray)
     return nullptr;
 
@@ -683,7 +684,7 @@
   if (!m_pFormDict)
     return -1;
 
-  const CPDF_Array* pArray = m_pFormDict->GetArrayFor("CO");
+  RetainPtr<const CPDF_Array> pArray = m_pFormDict->GetArrayFor("CO");
   if (!pArray)
     return -1;
 
diff --git a/core/fpdfdoc/cpdf_nametree.cpp b/core/fpdfdoc/cpdf_nametree.cpp
index e3f314d..a2860b0 100644
--- a/core/fpdfdoc/cpdf_nametree.cpp
+++ b/core/fpdfdoc/cpdf_nametree.cpp
@@ -99,7 +99,7 @@
   if (pLimits)
     std::tie(csLeft, csRight) = GetNodeLimitsAndSanitize(pLimits.Get());
 
-  const CPDF_Array* pNames = pNode->GetArrayFor("Names");
+  RetainPtr<const CPDF_Array> pNames = pNode->GetArrayFor("Names");
   if (pNames) {
     if (pNames != pFind)
       return false;
@@ -152,7 +152,8 @@
     WideString csNewLeft = csRight;
     WideString csNewRight = csLeft;
     for (size_t j = 0; j < pKids->size(); ++j) {
-      const CPDF_Array* pKidLimits = pKids->GetDictAt(j)->GetArrayFor("Limits");
+      RetainPtr<const CPDF_Array> pKidLimits =
+          pKids->GetDictAt(j)->GetArrayFor("Limits");
       DCHECK(pKidLimits);
       if (pKidLimits->GetUnicodeTextAt(0).Compare(csNewLeft) < 0)
         csNewLeft = pKidLimits->GetUnicodeTextAt(0);
@@ -364,11 +365,11 @@
   if (!inserted)
     return 0;
 
-  const CPDF_Array* pNames = pNode->GetArrayFor("Names");
+  RetainPtr<const CPDF_Array> pNames = pNode->GetArrayFor("Names");
   if (pNames)
     return pNames->size() / 2;
 
-  const CPDF_Array* pKids = pNode->GetArrayFor("Kids");
+  RetainPtr<const CPDF_Array> pKids = pNode->GetArrayFor("Kids");
   if (!pKids)
     return 0;
 
@@ -390,7 +391,7 @@
     return array;
   RetainPtr<const CPDF_Dictionary> dict = ToDictionary(obj);
   if (dict)
-    return pdfium::WrapRetain(dict->GetArrayFor("D"));
+    return dict->GetArrayFor("D");
   return nullptr;
 }
 
diff --git a/core/fpdfdoc/cpdf_nametree_unittest.cpp b/core/fpdfdoc/cpdf_nametree_unittest.cpp
index afa5d7b..205c213 100644
--- a/core/fpdfdoc/cpdf_nametree_unittest.cpp
+++ b/core/fpdfdoc/cpdf_nametree_unittest.cpp
@@ -38,7 +38,7 @@
                       const char* least,
                       const char* greatest) {
   ASSERT_TRUE(node);
-  const CPDF_Array* limits = node->GetArrayFor("Limits");
+  RetainPtr<const CPDF_Array> limits = node->GetArrayFor("Limits");
   ASSERT_TRUE(limits);
   EXPECT_EQ(2u, limits->size());
   RetainPtr<const CPDF_String> left = limits->GetStringAt(0);
@@ -270,9 +270,9 @@
       pKid1->GetArrayFor("Kids")->GetDictAt(1);
   ASSERT_TRUE(pGrandKid3);
   CheckLimitsArray(pGrandKid3.Get(), "9.txt", "99.txt");
-  const CPDF_Array* pNames = pGrandKid3->GetArrayFor("Names");
-  CheckNameKeyValue(pNames, 0, "9.txt", 999);
-  CheckNameKeyValue(pNames, 1, "99.txt", 99);
+  RetainPtr<const CPDF_Array> pNames = pGrandKid3->GetArrayFor("Names");
+  CheckNameKeyValue(pNames.Get(), 0, "9.txt", 999);
+  CheckNameKeyValue(pNames.Get(), 1, "99.txt", 99);
 
   // Check that the nodes on the third level has the expected limits and names.
   RetainPtr<const CPDF_Dictionary> pGreatGrandKid4 =
@@ -280,19 +280,19 @@
   ASSERT_TRUE(pGreatGrandKid4);
   CheckLimitsArray(pGreatGrandKid4.Get(), "0.txt", "2.txt");
   pNames = pGreatGrandKid4->GetArrayFor("Names");
-  CheckNameKeyValue(pNames, 0, "0.txt", -5);
-  CheckNameKeyValue(pNames, 1, "1.txt", 111);
-  CheckNameKeyValue(pNames, 2, "2.txt", 222);
+  CheckNameKeyValue(pNames.Get(), 0, "0.txt", -5);
+  CheckNameKeyValue(pNames.Get(), 1, "1.txt", 111);
+  CheckNameKeyValue(pNames.Get(), 2, "2.txt", 222);
 
   RetainPtr<const CPDF_Dictionary> pGreatGrandKid5 =
       pGrandKid2->GetArrayFor("Kids")->GetDictAt(1);
   ASSERT_TRUE(pGreatGrandKid5);
   CheckLimitsArray(pGreatGrandKid5.Get(), "3.txt", "6.txt");
   pNames = pGreatGrandKid5->GetArrayFor("Names");
-  CheckNameKeyValue(pNames, 0, "3.txt", 333);
-  CheckNameKeyValue(pNames, 1, "4.txt", 444);
-  CheckNameKeyValue(pNames, 2, "5.txt", 555);
-  CheckNameKeyValue(pNames, 3, "6.txt", 666);
+  CheckNameKeyValue(pNames.Get(), 0, "3.txt", 333);
+  CheckNameKeyValue(pNames.Get(), 1, "4.txt", 444);
+  CheckNameKeyValue(pNames.Get(), 2, "5.txt", 555);
+  CheckNameKeyValue(pNames.Get(), 3, "6.txt", 666);
 }
 
 TEST(cpdf_nametree, DeleteFromKids) {
diff --git a/core/fpdfdoc/cpdf_numbertree.cpp b/core/fpdfdoc/cpdf_numbertree.cpp
index a2c09fc..71cb3ef 100644
--- a/core/fpdfdoc/cpdf_numbertree.cpp
+++ b/core/fpdfdoc/cpdf_numbertree.cpp
@@ -13,12 +13,12 @@
 
 // TODO(tsepez): return retained objects.
 const CPDF_Object* SearchNumberNode(const CPDF_Dictionary* pNode, int num) {
-  const CPDF_Array* pLimits = pNode->GetArrayFor("Limits");
+  RetainPtr<const CPDF_Array> pLimits = pNode->GetArrayFor("Limits");
   if (pLimits &&
       (num < pLimits->GetIntegerAt(0) || num > pLimits->GetIntegerAt(1))) {
     return nullptr;
   }
-  const CPDF_Array* pNumbers = pNode->GetArrayFor("Nums");
+  RetainPtr<const CPDF_Array> pNumbers = pNode->GetArrayFor("Nums");
   if (pNumbers) {
     for (size_t i = 0; i < pNumbers->size() / 2; i++) {
       int index = pNumbers->GetIntegerAt(i * 2);
@@ -30,7 +30,7 @@
     return nullptr;
   }
 
-  const CPDF_Array* pKids = pNode->GetArrayFor("Kids");
+  RetainPtr<const CPDF_Array> pKids = pNode->GetArrayFor("Kids");
   if (!pKids)
     return nullptr;
 
diff --git a/core/fpdfdoc/cpdf_viewerpreferences.cpp b/core/fpdfdoc/cpdf_viewerpreferences.cpp
index c6ebe97..19d0780 100644
--- a/core/fpdfdoc/cpdf_viewerpreferences.cpp
+++ b/core/fpdfdoc/cpdf_viewerpreferences.cpp
@@ -31,9 +31,10 @@
   return pDict ? pDict->GetIntegerFor("NumCopies") : 1;
 }
 
+// TODO(tsepez): return retained references.
 const CPDF_Array* CPDF_ViewerPreferences::PrintPageRange() const {
   const CPDF_Dictionary* pDict = GetViewerPreferences();
-  return pDict ? pDict->GetArrayFor("PrintPageRange") : nullptr;
+  return pDict ? pDict->GetArrayFor("PrintPageRange").Get() : nullptr;
 }
 
 ByteString CPDF_ViewerPreferences::Duplex() const {
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp
index 09f233c..90f55c1 100644
--- a/core/fxge/skia/fx_skia_device.cpp
+++ b/core/fxge/skia/fx_skia_device.cpp
@@ -2196,7 +2196,7 @@
     return false;
   RetainPtr<const CPDF_Dictionary> pDict =
       pPattern->GetShadingObject()->GetDict();
-  const CPDF_Array* pCoords = pDict->GetArrayFor("Coords");
+  RetainPtr<const CPDF_Array> pCoords = pDict->GetArrayFor("Coords");
   if (!pCoords && kCoonsPatchMeshShading != shadingType)
     return false;
   // TODO(caryclark) Respect Domain[0], Domain[1]. (Don't know what they do
@@ -2226,7 +2226,7 @@
       return false;
     }
   }
-  const CPDF_Array* pArray = pDict->GetArrayFor("Extend");
+  RetainPtr<const CPDF_Array> pArray = pDict->GetArrayFor("Extend");
   bool clipStart = !pArray || !pArray->GetIntegerAt(0);
   bool clipEnd = !pArray || !pArray->GetIntegerAt(1);
   SkPaint paint;
diff --git a/fpdfsdk/cpdfsdk_baannot.cpp b/fpdfsdk/cpdfsdk_baannot.cpp
index 45ac08b..dbc32a4 100644
--- a/fpdfsdk/cpdfsdk_baannot.cpp
+++ b/fpdfsdk/cpdfsdk_baannot.cpp
@@ -132,7 +132,7 @@
 }
 
 int CPDFSDK_BAAnnot::GetBorderWidth() const {
-  const CPDF_Array* pBorder =
+  RetainPtr<const CPDF_Array> pBorder =
       GetAnnotDict()->GetArrayFor(pdfium::annotation::kBorder);
   if (pBorder)
     return pBorder->GetIntegerAt(2);
@@ -186,7 +186,7 @@
       return BorderStyle::kUnderline;
   }
 
-  const CPDF_Array* pBorder =
+  RetainPtr<const CPDF_Array> pBorder =
       GetAnnotDict()->GetArrayFor(pdfium::annotation::kBorder);
   if (pBorder) {
     if (pBorder->size() >= 4) {
diff --git a/fpdfsdk/cpdfsdk_formfillenvironment.cpp b/fpdfsdk/cpdfsdk_formfillenvironment.cpp
index 3459125..2ab2472 100644
--- a/fpdfsdk/cpdfsdk_formfillenvironment.cpp
+++ b/fpdfsdk/cpdfsdk_formfillenvironment.cpp
@@ -659,7 +659,7 @@
   if (!pRoot)
     return false;
 
-  const CPDF_Object* pOpenAction = pRoot->GetDictFor("OpenAction");
+  RetainPtr<const CPDF_Object> pOpenAction(pRoot->GetDictFor("OpenAction"));
   if (!pOpenAction)
     pOpenAction = pRoot->GetArrayFor("OpenAction");
   if (!pOpenAction)
diff --git a/fpdfsdk/cpdfsdk_helpers.cpp b/fpdfsdk/cpdfsdk_helpers.cpp
index fef517b..762cfc3 100644
--- a/fpdfsdk/cpdfsdk_helpers.cpp
+++ b/fpdfsdk/cpdfsdk_helpers.cpp
@@ -226,7 +226,8 @@
 
 const CPDF_Array* GetQuadPointsArrayFromDictionary(
     const CPDF_Dictionary* dict) {
-  return dict->GetArrayFor("QuadPoints");
+  // TODO(tsepez): return retained object.
+  return dict->GetArrayFor("QuadPoints").Get();
 }
 
 RetainPtr<CPDF_Array> GetMutableQuadPointsArrayFromDictionary(
@@ -364,7 +365,7 @@
 
     const CPDF_Dictionary* pJSDict = pNameDict->GetDictFor("JavaScript");
     if (pJSDict) {
-      const CPDF_Array* pArray = pJSDict->GetArrayFor("Names");
+      RetainPtr<const CPDF_Array> pArray = pJSDict->GetArrayFor("Names");
       if (pArray) {
         for (size_t i = 0; i < pArray->size(); i++) {
           ByteString cbStr = pArray->GetByteStringAt(i);
diff --git a/fpdfsdk/cpdfsdk_interactiveform.cpp b/fpdfsdk/cpdfsdk_interactiveform.cpp
index f3709b5..700b352 100644
--- a/fpdfsdk/cpdfsdk_interactiveform.cpp
+++ b/fpdfsdk/cpdfsdk_interactiveform.cpp
@@ -81,7 +81,7 @@
   if (!pMainDict)
     return ByteString();
 
-  const CPDF_Array* pFields = pMainDict->GetArrayFor("Fields");
+  RetainPtr<const CPDF_Array> pFields = pMainDict->GetArrayFor("Fields");
   if (!pFields)
     return ByteString();
 
@@ -180,7 +180,7 @@
     if (!pPageDict)
       continue;
 
-    const CPDF_Array* pAnnots = pPageDict->GetArrayFor("Annots");
+    RetainPtr<const CPDF_Array> pAnnots = pPageDict->GetArrayFor("Annots");
     if (!pAnnots)
       continue;
 
diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp
index 253e25f..bed7b61 100644
--- a/fpdfsdk/fpdf_annot.cpp
+++ b/fpdfsdk/fpdf_annot.cpp
@@ -323,14 +323,16 @@
   return pFormControl ? pForm->GetWidget(pFormControl) : nullptr;
 }
 
+// TODO(tsepez): return retained references.
 const CPDF_Array* GetInkList(FPDF_ANNOTATION annot) {
   FPDF_ANNOTATION_SUBTYPE subtype = FPDFAnnot_GetSubtype(annot);
   if (subtype != FPDF_ANNOT_INK)
     return nullptr;
 
   const CPDF_Dictionary* annot_dict = GetAnnotDictFromFPDFAnnotation(annot);
-  return annot_dict ? annot_dict->GetArrayFor(pdfium::annotation::kInkList)
-                    : nullptr;
+  return annot_dict
+             ? annot_dict->GetArrayFor(pdfium::annotation::kInkList).Get()
+             : nullptr;
 }
 
 }  // namespace
@@ -384,7 +386,7 @@
   if (!pPage)
     return 0;
 
-  const CPDF_Array* pAnnots = pPage->GetDict()->GetArrayFor("Annots");
+  RetainPtr<const CPDF_Array> pAnnots = pPage->GetDict()->GetArrayFor("Annots");
   return pAnnots ? fxcrt::CollectionSize<int>(*pAnnots) : 0;
 }
 
@@ -421,7 +423,7 @@
   if (!pAnnotDict)
     return -1;
 
-  const CPDF_Array* pAnnots = pPage->GetDict()->GetArrayFor("Annots");
+  RetainPtr<const CPDF_Array> pAnnots = pPage->GetDict()->GetArrayFor("Annots");
   if (!pAnnots)
     return -1;
 
@@ -709,7 +711,7 @@
   if (HasAPStream(pAnnotDict.Get()))
     return false;
 
-  const CPDF_Array* pColor = pAnnotDict->GetArrayFor(
+  RetainPtr<const CPDF_Array> pColor = pAnnotDict->GetArrayFor(
       type == FPDFANNOT_COLORTYPE_InteriorColor ? "IC" : "C");
   *A = (pAnnotDict->KeyExist("CA") ? pAnnotDict->GetFloatFor("CA") : 1) * 255.f;
   if (!pColor) {
@@ -878,7 +880,7 @@
   if (!annot_dict)
     return 0;
 
-  const CPDF_Array* vertices =
+  RetainPtr<const CPDF_Array> vertices =
       annot_dict->GetArrayFor(pdfium::annotation::kVertices);
   if (!vertices)
     return 0;
@@ -940,7 +942,8 @@
   if (!annot_dict)
     return false;
 
-  const CPDF_Array* line = annot_dict->GetArrayFor(pdfium::annotation::kL);
+  RetainPtr<const CPDF_Array> line =
+      annot_dict->GetArrayFor(pdfium::annotation::kL);
   if (!line || line->size() < 4)
     return false;
 
@@ -984,7 +987,7 @@
   if (!annot_dict)
     return false;
 
-  const CPDF_Array* border =
+  RetainPtr<const CPDF_Array> border =
       annot_dict->GetArrayFor(pdfium::annotation::kBorder);
   if (!border || border->size() < 3)
     return false;
diff --git a/fpdfsdk/fpdf_annot_embeddertest.cpp b/fpdfsdk/fpdf_annot_embeddertest.cpp
index 3d07911..fa7a14a 100644
--- a/fpdfsdk/fpdf_annot_embeddertest.cpp
+++ b/fpdfsdk/fpdf_annot_embeddertest.cpp
@@ -272,7 +272,7 @@
   EXPECT_EQ(0, FPDFAnnot_AddInkStroke(ink_annot.get(), kFirstInkStroke,
                                       kFirstStrokePointCount));
 
-  const CPDF_Array* inklist = annot_dict->GetArrayFor("InkList");
+  RetainPtr<const CPDF_Array> inklist = annot_dict->GetArrayFor("InkList");
   ASSERT_TRUE(inklist);
   EXPECT_EQ(1u, inklist->size());
   EXPECT_EQ(kFirstStrokePointCount * 2, inklist->GetArrayAt(0)->size());
@@ -328,7 +328,7 @@
   EXPECT_EQ(0,
             FPDFAnnot_AddInkStroke(ink_annot.get(), kInkStroke, kPointCount));
 
-  const CPDF_Array* inklist = annot_dict->GetArrayFor("InkList");
+  RetainPtr<const CPDF_Array> inklist = annot_dict->GetArrayFor("InkList");
   ASSERT_TRUE(inklist);
   ASSERT_EQ(1u, inklist->size());
   EXPECT_EQ(kPointCount * 2, inklist->GetArrayAt(0)->size());
diff --git a/fpdfsdk/fpdf_edit_embeddertest.cpp b/fpdfsdk/fpdf_edit_embeddertest.cpp
index 2131afb..7029c38 100644
--- a/fpdfsdk/fpdf_edit_embeddertest.cpp
+++ b/fpdfsdk/fpdf_edit_embeddertest.cpp
@@ -115,7 +115,7 @@
     EXPECT_TRUE(FontStyleIsNonSymbolic(font_flags));
     ASSERT_TRUE(font_desc->KeyExist("FontBBox"));
 
-    const CPDF_Array* fontBBox = font_desc->GetArrayFor("FontBBox");
+    RetainPtr<const CPDF_Array> fontBBox = font_desc->GetArrayFor("FontBBox");
     ASSERT_TRUE(fontBBox);
     EXPECT_EQ(4u, fontBBox->size());
     // Check that the coordinates are in the preferred order according to spec
@@ -2954,7 +2954,7 @@
   EXPECT_EQ(32, font_dict->GetIntegerFor("FirstChar"));
   EXPECT_EQ(255, font_dict->GetIntegerFor("LastChar"));
 
-  const CPDF_Array* widths_array = font_dict->GetArrayFor("Widths");
+  RetainPtr<const CPDF_Array> widths_array = font_dict->GetArrayFor("Widths");
   ASSERT_TRUE(widths_array);
   ASSERT_EQ(224u, widths_array->size());
   EXPECT_EQ(250, widths_array->GetFloatAt(0));
@@ -2983,7 +2983,7 @@
   EXPECT_EQ(32, font_dict->GetIntegerFor("FirstChar"));
   EXPECT_EQ(255, font_dict->GetIntegerFor("LastChar"));
 
-  const CPDF_Array* widths_array = font_dict->GetArrayFor("Widths");
+  RetainPtr<const CPDF_Array> widths_array = font_dict->GetArrayFor("Widths");
   ASSERT_TRUE(widths_array);
   ASSERT_EQ(224u, widths_array->size());
   EXPECT_EQ(600, widths_array->GetFloatAt(33));
@@ -3009,7 +3009,7 @@
   EXPECT_EQ("Type0", font_dict->GetNameFor("Subtype"));
   EXPECT_EQ("Tinos-Regular-Identity-H", font_dict->GetNameFor("BaseFont"));
   EXPECT_EQ("Identity-H", font_dict->GetNameFor("Encoding"));
-  const CPDF_Array* descendant_array =
+  RetainPtr<const CPDF_Array> descendant_array =
       font_dict->GetArrayFor("DescendantFonts");
   ASSERT_TRUE(descendant_array);
   EXPECT_EQ(1u, descendant_array->size());
@@ -3037,10 +3037,10 @@
   CheckFontDescriptor(cidfont_dict.Get(), FPDF_FONT_TYPE1, false, false, span);
 
   // Check widths
-  const CPDF_Array* widths_array = cidfont_dict->GetArrayFor("W");
+  RetainPtr<const CPDF_Array> widths_array = cidfont_dict->GetArrayFor("W");
   ASSERT_TRUE(widths_array);
   EXPECT_GT(widths_array->size(), 1u);
-  CheckCompositeFontWidths(widths_array, typed_font);
+  CheckCompositeFontWidths(widths_array.Get(), typed_font);
 }
 
 TEST_F(FPDFEditEmbedderTest, LoadCIDType2Font) {
@@ -3060,7 +3060,7 @@
   EXPECT_EQ("Type0", font_dict->GetNameFor("Subtype"));
   EXPECT_EQ("Arimo-Italic", font_dict->GetNameFor("BaseFont"));
   EXPECT_EQ("Identity-H", font_dict->GetNameFor("Encoding"));
-  const CPDF_Array* descendant_array =
+  RetainPtr<const CPDF_Array> descendant_array =
       font_dict->GetArrayFor("DescendantFonts");
   ASSERT_TRUE(descendant_array);
   EXPECT_EQ(1u, descendant_array->size());
@@ -3081,9 +3081,9 @@
                       span);
 
   // Check widths
-  const CPDF_Array* widths_array = cidfont_dict->GetArrayFor("W");
+  RetainPtr<const CPDF_Array> widths_array = cidfont_dict->GetArrayFor("W");
   ASSERT_TRUE(widths_array);
-  CheckCompositeFontWidths(widths_array, typed_font);
+  CheckCompositeFontWidths(widths_array.Get(), typed_font);
 }
 
 TEST_F(FPDFEditEmbedderTest, NormalizeNegativeRotation) {
diff --git a/fpdfsdk/fpdf_flatten.cpp b/fpdfsdk/fpdf_flatten.cpp
index 81fdeb2..dd63a6e 100644
--- a/fpdfsdk/fpdf_flatten.cpp
+++ b/fpdfsdk/fpdf_flatten.cpp
@@ -93,7 +93,7 @@
     return FLATTEN_FAIL;
 
   GetContentsRect(pSourceDoc, pPageDic, pRectArray);
-  const CPDF_Array* pAnnots = pPageDic->GetArrayFor("Annots");
+  RetainPtr<const CPDF_Array> pAnnots = pPageDic->GetArrayFor("Annots");
   if (!pAnnots)
     return FLATTEN_NOTHINGTODO;
 
diff --git a/fpdfsdk/fpdf_signature.cpp b/fpdfsdk/fpdf_signature.cpp
index 8fce2f4..aeb7c56 100644
--- a/fpdfsdk/fpdf_signature.cpp
+++ b/fpdfsdk/fpdf_signature.cpp
@@ -26,11 +26,11 @@
   if (!acro_form)
     return signatures;
 
-  const CPDF_Array* fields = acro_form->GetArrayFor("Fields");
+  RetainPtr<const CPDF_Array> fields = acro_form->GetArrayFor("Fields");
   if (!fields)
     return signatures;
 
-  CPDF_ArrayLocker locker(fields);
+  CPDF_ArrayLocker locker(std::move(fields));
   for (auto& field : locker) {
     RetainPtr<CPDF_Dictionary> field_dict = field->GetMutableDict();
     if (field_dict && field_dict->GetNameFor("FT") == "Sig")
@@ -97,7 +97,7 @@
   if (!value_dict)
     return 0;
 
-  const CPDF_Array* byte_range = value_dict->GetArrayFor("ByteRange");
+  RetainPtr<const CPDF_Array> byte_range = value_dict->GetArrayFor("ByteRange");
   if (!byte_range)
     return 0;
 
@@ -180,11 +180,11 @@
   if (!value_dict)
     return permission;
 
-  const CPDF_Array* references = value_dict->GetArrayFor("Reference");
+  RetainPtr<const CPDF_Array> references = value_dict->GetArrayFor("Reference");
   if (!references)
     return permission;
 
-  CPDF_ArrayLocker locker(references);
+  CPDF_ArrayLocker locker(std::move(references));
   for (auto& reference : locker) {
     const CPDF_Dictionary* reference_dict = reference->GetDict().Get();
     if (!reference_dict)
diff --git a/fpdfsdk/fpdf_structtree.cpp b/fpdfsdk/fpdf_structtree.cpp
index e18bd84..ed408bb 100644
--- a/fpdfsdk/fpdf_structtree.cpp
+++ b/fpdfsdk/fpdf_structtree.cpp
@@ -184,7 +184,7 @@
   CPDF_StructElement* elem =
       CPDFStructElementFromFPDFStructElement(struct_element);
   const CPDF_Dictionary* dict = elem ? elem->GetDict() : nullptr;
-  const CPDF_Array* array = dict ? dict->GetArrayFor("A") : nullptr;
+  RetainPtr<const CPDF_Array> array = dict ? dict->GetArrayFor("A") : nullptr;
   if (!array)
     return 0;
   CPDF_ArrayLocker locker(array);
diff --git a/fpdfsdk/fpdf_transformpage.cpp b/fpdfsdk/fpdf_transformpage.cpp
index 4254666..f274512 100644
--- a/fpdfsdk/fpdf_transformpage.cpp
+++ b/fpdfsdk/fpdf_transformpage.cpp
@@ -50,7 +50,7 @@
   if (!page || !left || !bottom || !right || !top)
     return false;
 
-  const CPDF_Array* pArray = page->GetDict()->GetArrayFor(key);
+  RetainPtr<const CPDF_Array> pArray = page->GetDict()->GetArrayFor(key);
   if (!pArray)
     return false;
 
diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp
index 0ba31a1..97a4a03 100644
--- a/fpdfsdk/fpdf_view.cpp
+++ b/fpdfsdk/fpdf_view.cpp
@@ -1134,7 +1134,7 @@
 
   auto name_tree = CPDF_NameTree::Create(pDoc, "Dests");
   size_t name_tree_count = name_tree ? name_tree->GetCount() : 0;
-  const CPDF_Object* pDestObj = nullptr;
+  RetainPtr<const CPDF_Object> pDestObj;
   WideString wsName;
   if (static_cast<size_t>(index) >= name_tree_count) {
     // If |index| is out of bounds, then try to retrieve the Nth old style named