M73: Fix data ownership in CPDF_ObjectStream.

Make CFX_ReadOnlyMemoryStream capable of holding onto data. Use it in
CPDF_ObjectStream to make the stream data refcounted, instead of letting
CPDF_ObjectStream have ownership.

Commit 0389ff1a incorrectly changed data ownership. Although
CPDF_ObjectStream does not hand out its |data_stream_| directly,
ParseObjectAtOffset() will use it with a local CPDF_SyntaxParser, and
the CPDF_SyntaxParser hands off the data stream to the returned object.

BUG=chromium:933212
TBR=dsinclair@chromium.org

Change-Id: I703735cfa7e2720af3008ec57158fd875d3a0723
Reviewed-on: https://pdfium-review.googlesource.com/c/50955
Reviewed-by: dsinclair <dsinclair@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
(cherry picked from commit 5f79016feed97837d94f98460fc90896641ba530)
Reviewed-on: https://pdfium-review.googlesource.com/c/51030
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_object_stream.cpp b/core/fpdfapi/parser/cpdf_object_stream.cpp
index 2a896b8..3f974ee 100644
--- a/core/fpdfapi/parser/cpdf_object_stream.cpp
+++ b/core/fpdfapi/parser/cpdf_object_stream.cpp
@@ -97,9 +97,8 @@
     auto stream_acc = pdfium::MakeRetain<CPDF_StreamAcc>(stream);
     stream_acc->LoadAllDataFiltered();
     const uint32_t data_size = stream_acc->GetSize();
-    data_ = stream_acc->DetachData();
     data_stream_ = pdfium::MakeRetain<CFX_ReadOnlyMemoryStream>(
-        pdfium::make_span(data_.get(), data_size));
+        stream_acc->DetachData(), data_size);
   }
 
   CPDF_SyntaxParser syntax(data_stream_);
diff --git a/core/fpdfapi/parser/cpdf_object_stream.h b/core/fpdfapi/parser/cpdf_object_stream.h
index e96cff0..008c0cd 100644
--- a/core/fpdfapi/parser/cpdf_object_stream.h
+++ b/core/fpdfapi/parser/cpdf_object_stream.h
@@ -47,8 +47,6 @@
   uint32_t obj_num_ = CPDF_Object::kInvalidObjNum;
   uint32_t extends_obj_num_ = CPDF_Object::kInvalidObjNum;
 
-  // |data_| holds the data used by |data_stream_|.
-  std::unique_ptr<uint8_t, FxFreeDeleter> data_;
   RetainPtr<IFX_SeekableReadStream> data_stream_;
   int first_object_offset_ = 0;
   std::map<uint32_t, uint32_t> objects_offsets_;
diff --git a/core/fxcrt/cfx_readonlymemorystream.cpp b/core/fxcrt/cfx_readonlymemorystream.cpp
index bd31ee3..807788a 100644
--- a/core/fxcrt/cfx_readonlymemorystream.cpp
+++ b/core/fxcrt/cfx_readonlymemorystream.cpp
@@ -6,9 +6,16 @@
 
 #include "core/fxcrt/cfx_readonlymemorystream.h"
 
+#include <utility>
+
 #include "core/fxcrt/fx_safe_types.h"
 
 CFX_ReadOnlyMemoryStream::CFX_ReadOnlyMemoryStream(
+    std::unique_ptr<uint8_t, FxFreeDeleter> data,
+    size_t size)
+    : m_data(std::move(data)), m_span(m_data.get(), size) {}
+
+CFX_ReadOnlyMemoryStream::CFX_ReadOnlyMemoryStream(
     pdfium::span<const uint8_t> span)
     : m_span(span) {}
 
diff --git a/core/fxcrt/cfx_readonlymemorystream.h b/core/fxcrt/cfx_readonlymemorystream.h
index df277b5..074ed8f 100644
--- a/core/fxcrt/cfx_readonlymemorystream.h
+++ b/core/fxcrt/cfx_readonlymemorystream.h
@@ -7,6 +7,9 @@
 #ifndef CORE_FXCRT_CFX_READONLYMEMORYSTREAM_H_
 #define CORE_FXCRT_CFX_READONLYMEMORYSTREAM_H_
 
+#include <memory>
+
+#include "core/fxcrt/fx_memory.h"
 #include "core/fxcrt/fx_stream.h"
 #include "core/fxcrt/retain_ptr.h"
 #include "third_party/base/span.h"
@@ -23,9 +26,12 @@
                          size_t size) override;
 
  private:
+  CFX_ReadOnlyMemoryStream(std::unique_ptr<uint8_t, FxFreeDeleter> data,
+                           size_t size);
   explicit CFX_ReadOnlyMemoryStream(pdfium::span<const uint8_t> span);
   ~CFX_ReadOnlyMemoryStream() override;
 
+  std::unique_ptr<uint8_t, FxFreeDeleter> m_data;
   const pdfium::span<const uint8_t> m_span;
 };