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);