Pass retained argument to CPDF_ObjectStream::Create()

Change-Id: I25170360cef55afa992b7b940312c461e3e487d3
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/101911
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_object_stream.cpp b/core/fpdfapi/parser/cpdf_object_stream.cpp
index 7d0bf58..1c5a7b7 100644
--- a/core/fpdfapi/parser/cpdf_object_stream.cpp
+++ b/core/fpdfapi/parser/cpdf_object_stream.cpp
@@ -54,20 +54,19 @@
 
 //  static
 std::unique_ptr<CPDF_ObjectStream> CPDF_ObjectStream::Create(
-    const CPDF_Stream* stream) {
-  if (!IsObjectStream(stream))
+    RetainPtr<const CPDF_Stream> stream) {
+  if (!IsObjectStream(stream.Get()))
     return nullptr;
 
   // Protected constructor.
-  return pdfium::WrapUnique(new CPDF_ObjectStream(stream));
+  return pdfium::WrapUnique(new CPDF_ObjectStream(std::move(stream)));
 }
 
-CPDF_ObjectStream::CPDF_ObjectStream(const CPDF_Stream* obj_stream)
-    : stream_acc_(
-          pdfium::MakeRetain<CPDF_StreamAcc>(pdfium::WrapRetain(obj_stream))),
+CPDF_ObjectStream::CPDF_ObjectStream(RetainPtr<const CPDF_Stream> obj_stream)
+    : stream_acc_(pdfium::MakeRetain<CPDF_StreamAcc>(obj_stream)),
       first_object_offset_(obj_stream->GetDict()->GetIntegerFor("First")) {
-  DCHECK(IsObjectStream(obj_stream));
-  Init(obj_stream);
+  DCHECK(IsObjectStream(obj_stream.Get()));
+  Init(obj_stream.Get());
 }
 
 CPDF_ObjectStream::~CPDF_ObjectStream() = default;
diff --git a/core/fpdfapi/parser/cpdf_object_stream.h b/core/fpdfapi/parser/cpdf_object_stream.h
index 2d13b95..cfa0737 100644
--- a/core/fpdfapi/parser/cpdf_object_stream.h
+++ b/core/fpdfapi/parser/cpdf_object_stream.h
@@ -32,7 +32,8 @@
     uint32_t obj_offset;
   };
 
-  static std::unique_ptr<CPDF_ObjectStream> Create(const CPDF_Stream* stream);
+  static std::unique_ptr<CPDF_ObjectStream> Create(
+      RetainPtr<const CPDF_Stream> stream);
 
   ~CPDF_ObjectStream();
 
@@ -42,7 +43,7 @@
   const std::vector<ObjectInfo>& object_info() const { return object_info_; }
 
  private:
-  explicit CPDF_ObjectStream(const CPDF_Stream* stream);
+  explicit CPDF_ObjectStream(RetainPtr<const CPDF_Stream> stream);
 
   void Init(const CPDF_Stream* stream);
   RetainPtr<CPDF_Object> ParseObjectAtOffset(
diff --git a/core/fpdfapi/parser/cpdf_object_stream_unittest.cpp b/core/fpdfapi/parser/cpdf_object_stream_unittest.cpp
index f33031d..43306f4 100644
--- a/core/fpdfapi/parser/cpdf_object_stream_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_object_stream_unittest.cpp
@@ -5,6 +5,7 @@
 #include "core/fpdfapi/parser/cpdf_object_stream.h"
 
 #include <iterator>
+#include <utility>
 
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
 #include "core/fpdfapi/parser/cpdf_indirect_object_holder.h"
@@ -39,7 +40,7 @@
   ByteStringView contents_view(kNormalStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  auto obj_stream = CPDF_ObjectStream::Create(stream.Get());
+  auto obj_stream = CPDF_ObjectStream::Create(std::move(stream));
   ASSERT_TRUE(obj_stream);
 
   EXPECT_THAT(obj_stream->object_info(),
@@ -84,7 +85,7 @@
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()),
       /*pDict=*/nullptr);
-  EXPECT_FALSE(CPDF_ObjectStream::Create(stream.Get()));
+  EXPECT_FALSE(CPDF_ObjectStream::Create(std::move(stream)));
 }
 
 TEST(ObjectStreamTest, StreamDictNoType) {
@@ -95,7 +96,7 @@
   ByteStringView contents_view(kNormalStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  EXPECT_FALSE(CPDF_ObjectStream::Create(stream.Get()));
+  EXPECT_FALSE(CPDF_ObjectStream::Create(std::move(stream)));
 }
 
 TEST(ObjectStreamTest, StreamDictWrongType) {
@@ -107,7 +108,7 @@
   ByteStringView contents_view(kNormalStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  EXPECT_FALSE(CPDF_ObjectStream::Create(stream.Get()));
+  EXPECT_FALSE(CPDF_ObjectStream::Create(std::move(stream)));
 }
 
 TEST(ObjectStreamTest, StreamDictWrongTypeValue) {
@@ -119,7 +120,7 @@
   ByteStringView contents_view(kNormalStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  EXPECT_FALSE(CPDF_ObjectStream::Create(stream.Get()));
+  EXPECT_FALSE(CPDF_ObjectStream::Create(std::move(stream)));
 }
 
 TEST(ObjectStreamTest, StreamDictNoCount) {
@@ -130,7 +131,7 @@
   ByteStringView contents_view(kNormalStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  EXPECT_FALSE(CPDF_ObjectStream::Create(stream.Get()));
+  EXPECT_FALSE(CPDF_ObjectStream::Create(std::move(stream)));
 }
 
 TEST(ObjectStreamTest, StreamDictFloatCount) {
@@ -142,7 +143,7 @@
   ByteStringView contents_view(kNormalStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  EXPECT_FALSE(CPDF_ObjectStream::Create(stream.Get()));
+  EXPECT_FALSE(CPDF_ObjectStream::Create(std::move(stream)));
 }
 
 TEST(ObjectStreamTest, StreamDictNegativeCount) {
@@ -154,7 +155,7 @@
   ByteStringView contents_view(kNormalStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  EXPECT_FALSE(CPDF_ObjectStream::Create(stream.Get()));
+  EXPECT_FALSE(CPDF_ObjectStream::Create(std::move(stream)));
 }
 
 TEST(ObjectStreamTest, StreamDictCountTooBig) {
@@ -166,7 +167,7 @@
   ByteStringView contents_view(kNormalStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  EXPECT_FALSE(CPDF_ObjectStream::Create(stream.Get()));
+  EXPECT_FALSE(CPDF_ObjectStream::Create(std::move(stream)));
 }
 
 TEST(ObjectStreamTest, StreamDictNoOffset) {
@@ -177,7 +178,7 @@
   ByteStringView contents_view(kNormalStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  EXPECT_FALSE(CPDF_ObjectStream::Create(stream.Get()));
+  EXPECT_FALSE(CPDF_ObjectStream::Create(std::move(stream)));
 }
 
 TEST(ObjectStreamTest, StreamDictFloatOffset) {
@@ -189,7 +190,7 @@
   ByteStringView contents_view(kNormalStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  EXPECT_FALSE(CPDF_ObjectStream::Create(stream.Get()));
+  EXPECT_FALSE(CPDF_ObjectStream::Create(std::move(stream)));
 }
 
 TEST(ObjectStreamTest, StreamDictNegativeOffset) {
@@ -201,7 +202,7 @@
   ByteStringView contents_view(kNormalStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  EXPECT_FALSE(CPDF_ObjectStream::Create(stream.Get()));
+  EXPECT_FALSE(CPDF_ObjectStream::Create(std::move(stream)));
 }
 
 TEST(ObjectStreamTest, StreamDictOffsetTooBig) {
@@ -214,7 +215,7 @@
   ByteStringView contents_view(kNormalStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  auto obj_stream = CPDF_ObjectStream::Create(stream.Get());
+  auto obj_stream = CPDF_ObjectStream::Create(std::move(stream));
   ASSERT_TRUE(obj_stream);
 
   EXPECT_THAT(obj_stream->object_info(),
@@ -237,7 +238,7 @@
   ByteStringView contents_view(kNormalStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  auto obj_stream = CPDF_ObjectStream::Create(stream.Get());
+  auto obj_stream = CPDF_ObjectStream::Create(std::move(stream));
   ASSERT_TRUE(obj_stream);
 
   EXPECT_THAT(obj_stream->object_info(),
@@ -269,7 +270,7 @@
   ByteStringView contents_view(kNormalStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  auto obj_stream = CPDF_ObjectStream::Create(stream.Get());
+  auto obj_stream = CPDF_ObjectStream::Create(std::move(stream));
   ASSERT_TRUE(obj_stream);
 
   // TODO(thestig): Can this avoid finding object 2?
@@ -297,7 +298,7 @@
   ByteStringView contents_view(kStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  auto obj_stream = CPDF_ObjectStream::Create(stream.Get());
+  auto obj_stream = CPDF_ObjectStream::Create(std::move(stream));
   ASSERT_TRUE(obj_stream);
 
   EXPECT_THAT(obj_stream->object_info(),
@@ -315,7 +316,7 @@
   ByteStringView contents_view(kStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  auto obj_stream = CPDF_ObjectStream::Create(stream.Get());
+  auto obj_stream = CPDF_ObjectStream::Create(std::move(stream));
   ASSERT_TRUE(obj_stream);
 
   // TODO(thestig): Should object 11 be rejected?
@@ -348,7 +349,7 @@
   ByteStringView contents_view(kStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  auto obj_stream = CPDF_ObjectStream::Create(stream.Get());
+  auto obj_stream = CPDF_ObjectStream::Create(std::move(stream));
   ASSERT_TRUE(obj_stream);
 
   // TODO(thestig): Should object 11 be rejected?
@@ -371,7 +372,7 @@
   ByteStringView contents_view(kStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  auto obj_stream = CPDF_ObjectStream::Create(stream.Get());
+  auto obj_stream = CPDF_ObjectStream::Create(std::move(stream));
   ASSERT_TRUE(obj_stream);
 
   // TODO(thestig): Should object 11 be rejected?
@@ -394,7 +395,7 @@
   ByteStringView contents_view(kStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  auto obj_stream = CPDF_ObjectStream::Create(stream.Get());
+  auto obj_stream = CPDF_ObjectStream::Create(std::move(stream));
   ASSERT_TRUE(obj_stream);
 
   EXPECT_THAT(obj_stream->object_info(),
@@ -437,7 +438,7 @@
   ByteStringView contents_view(kStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  auto obj_stream = CPDF_ObjectStream::Create(stream.Get());
+  auto obj_stream = CPDF_ObjectStream::Create(std::move(stream));
   ASSERT_TRUE(obj_stream);
 
   EXPECT_THAT(obj_stream->object_info(),
@@ -479,7 +480,7 @@
   ByteStringView contents_view(kStreamContent);
   auto stream = pdfium::MakeRetain<CPDF_Stream>(
       DataVector<uint8_t>(contents_view.begin(), contents_view.end()), dict);
-  auto obj_stream = CPDF_ObjectStream::Create(stream.Get());
+  auto obj_stream = CPDF_ObjectStream::Create(std::move(stream));
   ASSERT_TRUE(obj_stream);
 
   EXPECT_THAT(obj_stream->object_info(),
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp
index cf7215d..65de611 100644
--- a/core/fpdfapi/parser/cpdf_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_parser.cpp
@@ -697,7 +697,8 @@
 
       if (obj_num < kMaxObjectNumber) {
         cross_ref_table->AddNormal(obj_num, gen_num, obj_pos);
-        const auto object_stream = CPDF_ObjectStream::Create(pStream.Get());
+        const auto object_stream =
+            CPDF_ObjectStream::Create(std::move(pStream));
         if (object_stream) {
           const auto& object_info = object_stream->object_info();
           for (size_t i = 0; i < object_info.size(); ++i) {
@@ -966,7 +967,7 @@
     return nullptr;
 
   std::unique_ptr<CPDF_ObjectStream> objs_stream =
-      CPDF_ObjectStream::Create(ToStream(object.Get()));
+      CPDF_ObjectStream::Create(ToStream(object));
   const CPDF_ObjectStream* result = objs_stream.get();
   m_ObjectStreamMap[object_number] = std::move(objs_stream);