Return retained objects frm CPDF_Image methods

Change-Id: If9a5086ceadeb8700a50da5e774ad778f36eb3c4
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/98594
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp b/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
index 9afda3f..03e16cb 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
+++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
@@ -313,7 +313,7 @@
   if (pImage->IsInline())
     return;
 
-  const CPDF_Stream* pStream = pImage->GetStream();
+  RetainPtr<const CPDF_Stream> pStream = pImage->GetStream();
   if (!pStream)
     return;
 
diff --git a/core/fpdfapi/page/cpdf_dib.cpp b/core/fpdfapi/page/cpdf_dib.cpp
index a11307c..ae0c257 100644
--- a/core/fpdfapi/page/cpdf_dib.cpp
+++ b/core/fpdfapi/page/cpdf_dib.cpp
@@ -154,8 +154,8 @@
 
 }  // namespace
 
-CPDF_DIB::CPDF_DIB(CPDF_Document* pDoc, const CPDF_Stream* pStream)
-    : m_pDocument(pDoc), m_pStream(pStream) {}
+CPDF_DIB::CPDF_DIB(CPDF_Document* pDoc, RetainPtr<const CPDF_Stream> pStream)
+    : m_pDocument(pDoc), m_pStream(std::move(pStream)) {}
 
 CPDF_DIB::~CPDF_DIB() = default;
 
@@ -802,7 +802,8 @@
 
 CPDF_DIB::LoadState CPDF_DIB::StartLoadMaskDIB(
     RetainPtr<const CPDF_Stream> mask_stream) {
-  m_pMask = pdfium::MakeRetain<CPDF_DIB>(m_pDocument.Get(), mask_stream.Get());
+  m_pMask =
+      pdfium::MakeRetain<CPDF_DIB>(m_pDocument.Get(), std::move(mask_stream));
   LoadState ret = m_pMask->StartLoadDIBBase(
       false, nullptr, nullptr, true, CPDF_ColorSpace::Family::kUnknown, false);
   if (ret == LoadState::kContinue) {
diff --git a/core/fpdfapi/page/cpdf_dib.h b/core/fpdfapi/page/cpdf_dib.h
index 155a1f9..7b99d0c 100644
--- a/core/fpdfapi/page/cpdf_dib.h
+++ b/core/fpdfapi/page/cpdf_dib.h
@@ -65,7 +65,7 @@
   RetainPtr<CPDF_DIB> DetachMask();
 
  private:
-  CPDF_DIB(CPDF_Document* pDoc, const CPDF_Stream* pStream);
+  CPDF_DIB(CPDF_Document* pDoc, RetainPtr<const CPDF_Stream> pStream);
   ~CPDF_DIB() override;
 
   struct JpxSMaskInlineData {
diff --git a/core/fpdfapi/page/cpdf_image.cpp b/core/fpdfapi/page/cpdf_image.cpp
index 0f90145..5f7283f 100644
--- a/core/fpdfapi/page/cpdf_image.cpp
+++ b/core/fpdfapi/page/cpdf_image.cpp
@@ -84,6 +84,14 @@
   return m_pStream ? m_pStream->GetDict() : nullptr;
 }
 
+RetainPtr<const CPDF_Stream> CPDF_Image::GetStream() const {
+  return m_pStream;
+}
+
+RetainPtr<const CPDF_Dictionary> CPDF_Image::GetOC() const {
+  return m_pOC;
+}
+
 RetainPtr<CPDF_Dictionary> CPDF_Image::InitJPEG(
     pdfium::span<uint8_t> src_span) {
   absl::optional<JpegModule::ImageInfo> info_opt =
diff --git a/core/fpdfapi/page/cpdf_image.h b/core/fpdfapi/page/cpdf_image.h
index 471d010..30f406c 100644
--- a/core/fpdfapi/page/cpdf_image.h
+++ b/core/fpdfapi/page/cpdf_image.h
@@ -34,8 +34,8 @@
   void ConvertStreamToIndirectObject();
 
   RetainPtr<const CPDF_Dictionary> GetDict() const;
-  const CPDF_Stream* GetStream() const { return m_pStream.Get(); }
-  const CPDF_Dictionary* GetOC() const { return m_pOC.Get(); }
+  RetainPtr<const CPDF_Stream> GetStream() const;
+  RetainPtr<const CPDF_Dictionary> GetOC() const;
   CPDF_Document* GetDocument() const { return m_pDocument.Get(); }
 
   int32_t GetPixelHeight() const { return m_Height; }
diff --git a/core/fpdfapi/page/cpdf_imageobject.cpp b/core/fpdfapi/page/cpdf_imageobject.cpp
index 0633ed1..636f2cb 100644
--- a/core/fpdfapi/page/cpdf_imageobject.cpp
+++ b/core/fpdfapi/page/cpdf_imageobject.cpp
@@ -86,7 +86,7 @@
   if (!pPageData)
     return;
 
-  const CPDF_Stream* pStream = m_pImage->GetStream();
+  RetainPtr<const CPDF_Stream> pStream = m_pImage->GetStream();
   if (!pStream)
     return;
 
diff --git a/core/fpdfapi/render/cpdf_imagerenderer.cpp b/core/fpdfapi/render/cpdf_imagerenderer.cpp
index 79164a2..8b4f5ca 100644
--- a/core/fpdfapi/render/cpdf_imagerenderer.cpp
+++ b/core/fpdfapi/render/cpdf_imagerenderer.cpp
@@ -196,7 +196,7 @@
   m_pImageObject = pImageObject;
   m_BlendType = blendType;
   m_mtObj2Device = mtObj2Device;
-  const CPDF_Dictionary* pOC = m_pImageObject->GetImage()->GetOC();
+  RetainPtr<const CPDF_Dictionary> pOC = m_pImageObject->GetImage()->GetOC();
   if (pOC && GetRenderOptions().GetOCContext() &&
       !GetRenderOptions().GetOCContext()->CheckOCGVisible(pOC)) {
     return false;
diff --git a/core/fpdfapi/render/cpdf_pagerendercache.cpp b/core/fpdfapi/render/cpdf_pagerendercache.cpp
index d7497de..687f51a 100644
--- a/core/fpdfapi/render/cpdf_pagerendercache.cpp
+++ b/core/fpdfapi/render/cpdf_pagerendercache.cpp
@@ -24,10 +24,11 @@
 namespace {
 
 struct CacheInfo {
-  CacheInfo(uint32_t t, const CPDF_Stream* stream) : time(t), pStream(stream) {}
+  CacheInfo(uint32_t t, RetainPtr<const CPDF_Stream> stream)
+      : time(t), pStream(std::move(stream)) {}
 
   uint32_t time;
-  const CPDF_Stream* pStream;
+  RetainPtr<const CPDF_Stream> pStream;
 
   bool operator<(const CacheInfo& other) const { return time < other.time; }
 };
@@ -56,7 +57,7 @@
   uint32_t nTimeCount = m_nTimeCount;
   if (nTimeCount + 1 < nTimeCount) {
     for (uint32_t i = 0; i < nCount; i++)
-      m_ImageCache[pdfium::WrapRetain(cache_info[i].pStream)]->SetTimeCount(i);
+      m_ImageCache[cache_info[i].pStream]->SetTimeCount(i);
     m_nTimeCount = nCount;
   }
 
@@ -81,7 +82,7 @@
     RetainPtr<CPDF_Image> pImage,
     const CPDF_RenderStatus* pRenderStatus,
     bool bStdCS) {
-  const CPDF_Stream* pStream = pImage->GetStream();
+  RetainPtr<const CPDF_Stream> pStream = pImage->GetStream();
   const auto it = m_ImageCache.find(pStream);
   m_bCurFindCache = it != m_ImageCache.end();
   if (m_bCurFindCache) {
@@ -97,7 +98,7 @@
 
   m_nTimeCount++;
   if (!m_bCurFindCache)
-    m_ImageCache[pdfium::WrapRetain(pStream)] = m_pCurImageCacheEntry.Release();
+    m_ImageCache[pStream] = m_pCurImageCacheEntry.Release();
 
   if (ret == CPDF_DIB::LoadState::kFail)
     m_nCacheSize += m_pCurImageCacheEntry->EstimateSize();
@@ -113,9 +114,7 @@
 
   m_nTimeCount++;
   if (!m_bCurFindCache) {
-    // TODO(tsepez): GetStream() should return retained reference.
-    m_ImageCache[pdfium::WrapRetain(
-        m_pCurImageCacheEntry->GetImage()->GetStream())] =
+    m_ImageCache[m_pCurImageCacheEntry->GetImage()->GetStream()] =
         m_pCurImageCacheEntry.Release();
   }
   m_nCacheSize += m_pCurImageCacheEntry->EstimateSize();
@@ -123,7 +122,7 @@
 }
 
 void CPDF_PageRenderCache::ResetBitmapForImage(RetainPtr<CPDF_Image> pImage) {
-  const CPDF_Stream* pStream = pImage->GetStream();
+  RetainPtr<const CPDF_Stream> pStream = pImage->GetStream();
   const auto it = m_ImageCache.find(pStream);
   if (it == m_ImageCache.end())
     return;
diff --git a/core/fxge/dib/cstretchengine_unittest.cpp b/core/fxge/dib/cstretchengine_unittest.cpp
index 26c550a..7308410 100644
--- a/core/fxge/dib/cstretchengine_unittest.cpp
+++ b/core/fxge/dib/cstretchengine_unittest.cpp
@@ -75,7 +75,7 @@
   dict_obj->SetNewFor<CPDF_Number>("Height", 12500);
   RetainPtr<CPDF_Stream> stream =
       pdfium::MakeRetain<CPDF_Stream>(nullptr, 0, std::move(dict_obj));
-  auto dib_source = pdfium::MakeRetain<CPDF_DIB>(nullptr, stream.Get());
+  auto dib_source = pdfium::MakeRetain<CPDF_DIB>(nullptr, stream);
   dib_source->Load();
   CStretchEngine engine(nullptr, FXDIB_Format::k8bppRgb, 500, 500, clip_rect,
                         dib_source, FXDIB_ResampleOptions());
diff --git a/fpdfsdk/fpdf_editimg.cpp b/fpdfsdk/fpdf_editimg.cpp
index 3c41243..85bc686 100644
--- a/fpdfsdk/fpdf_editimg.cpp
+++ b/fpdfsdk/fpdf_editimg.cpp
@@ -17,6 +17,7 @@
 #include "core/fpdfapi/parser/cpdf_array.h"
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
 #include "core/fpdfapi/parser/cpdf_name.h"
+#include "core/fpdfapi/parser/cpdf_stream.h"
 #include "core/fpdfapi/parser/cpdf_stream_acc.h"
 #include "core/fpdfapi/render/cpdf_imagerenderer.h"
 #include "core/fpdfapi/render/cpdf_rendercontext.h"
@@ -276,11 +277,11 @@
   if (!pImg)
     return 0;
 
-  const CPDF_Stream* pImgStream = pImg->GetStream();
+  RetainPtr<const CPDF_Stream> pImgStream = pImg->GetStream();
   if (!pImgStream)
     return 0;
 
-  return DecodeStreamMaybeCopyAndReturnLength(pImgStream, buffer, buflen);
+  return DecodeStreamMaybeCopyAndReturnLength(pImgStream.Get(), buffer, buflen);
 }
 
 FPDF_EXPORT unsigned long FPDF_CALLCONV
@@ -295,11 +296,11 @@
   if (!pImg)
     return 0;
 
-  const CPDF_Stream* pImgStream = pImg->GetStream();
+  RetainPtr<const CPDF_Stream> pImgStream = pImg->GetStream();
   if (!pImgStream)
     return 0;
 
-  return GetRawStreamMaybeCopyAndReturnLength(pImgStream, buffer, buflen);
+  return GetRawStreamMaybeCopyAndReturnLength(pImgStream.Get(), buffer, buflen);
 }
 
 FPDF_EXPORT int FPDF_CALLCONV
diff --git a/fpdfsdk/fpdf_thumbnail.cpp b/fpdfsdk/fpdf_thumbnail.cpp
index eaef5ae..c09ac2d 100644
--- a/fpdfsdk/fpdf_thumbnail.cpp
+++ b/fpdfsdk/fpdf_thumbnail.cpp
@@ -4,6 +4,8 @@
 
 #include "public/fpdf_thumbnail.h"
 
+#include <utility>
+
 #include "core/fpdfapi/page/cpdf_dib.h"
 #include "core/fpdfapi/page/cpdf_page.h"
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
@@ -54,14 +56,15 @@
 
 FPDF_EXPORT FPDF_BITMAP FPDF_CALLCONV
 FPDFPage_GetThumbnailAsBitmap(FPDF_PAGE page) {
-  const CPDF_Stream* thumb_stream = CPDFStreamForThumbnailFromPage(page);
+  RetainPtr<const CPDF_Stream> thumb_stream =
+      pdfium::WrapRetain(CPDFStreamForThumbnailFromPage(page));
   if (!thumb_stream)
     return nullptr;
 
   const CPDF_Page* p_page = CPDFPageFromFPDFPage(page);
 
-  auto p_source =
-      pdfium::MakeRetain<CPDF_DIB>(p_page->GetDocument(), thumb_stream);
+  auto p_source = pdfium::MakeRetain<CPDF_DIB>(p_page->GetDocument(),
+                                               std::move(thumb_stream));
   const CPDF_DIB::LoadState start_status = p_source->StartLoadDIBBase(
       false, nullptr, p_page->GetPageResources(), false,
       CPDF_ColorSpace::Family::kUnknown, false);