summaryrefslogtreecommitdiff
path: root/core/fpdfapi/parser
diff options
context:
space:
mode:
authortsepez <tsepez@chromium.org>2016-11-21 13:19:10 -0800
committerCommit bot <commit-bot@chromium.org>2016-11-21 13:19:10 -0800
commit9e05ee1e7bfb74d56d69620ad1e72b03e29b9237 (patch)
tree12b47b617d99edc7bd2715292402b74e864e1fa4 /core/fpdfapi/parser
parentaa3922dd713d480229408f3a0813b7dab9e8fd78 (diff)
downloadpdfium-9e05ee1e7bfb74d56d69620ad1e72b03e29b9237.tar.xz
Make CPDF_Stream() take unique_ptr's to its dictionary.
Review-Url: https://codereview.chromium.org/2520493002
Diffstat (limited to 'core/fpdfapi/parser')
-rw-r--r--core/fpdfapi/parser/cpdf_object_unittest.cpp21
-rw-r--r--core/fpdfapi/parser/cpdf_stream.cpp26
-rw-r--r--core/fpdfapi/parser/cpdf_stream.h13
-rw-r--r--core/fpdfapi/parser/cpdf_syntax_parser.cpp3
4 files changed, 40 insertions, 23 deletions
diff --git a/core/fpdfapi/parser/cpdf_object_unittest.cpp b/core/fpdfapi/parser/cpdf_object_unittest.cpp
index 86645934bf..303ad6fa7a 100644
--- a/core/fpdfapi/parser/cpdf_object_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_object_unittest.cpp
@@ -71,10 +71,12 @@ class PDFObjectsTest : public testing::Test {
size_t buf_len = FX_ArraySize(content);
uint8_t* buf = reinterpret_cast<uint8_t*>(malloc(buf_len));
memcpy(buf, content, buf_len);
- m_StreamDictObj = new CPDF_Dictionary();
+ auto pNewDict = pdfium::MakeUnique<CPDF_Dictionary>();
+ m_StreamDictObj = pNewDict.get();
m_StreamDictObj->SetNewFor<CPDF_String>("key1", L" test dict");
m_StreamDictObj->SetNewFor<CPDF_Number>("key2", -1);
- CPDF_Stream* stream_obj = new CPDF_Stream(buf, buf_len, m_StreamDictObj);
+ CPDF_Stream* stream_obj =
+ new CPDF_Stream(buf, buf_len, std::move(pNewDict));
// Null Object.
CPDF_Null* null_obj = new CPDF_Null;
// All direct objects.
@@ -588,7 +590,8 @@ TEST(PDFArrayTest, GetTypeAt) {
size_t data_size = FX_ArraySize(content);
uint8_t* data = reinterpret_cast<uint8_t*>(malloc(data_size));
memcpy(data, content, data_size);
- stream_vals[i] = arr->AddNew<CPDF_Stream>(data, data_size, vals[i]);
+ stream_vals[i] = arr->AddNew<CPDF_Stream>(data, data_size,
+ pdfium::WrapUnique(vals[i]));
}
for (size_t i = 0; i < 3; ++i) {
TestArrayAccessors(arr.get(), i, // Array and index.
@@ -633,8 +636,8 @@ TEST(PDFArrayTest, GetTypeAt) {
size_t buf_size = sizeof(data);
uint8_t* buf = reinterpret_cast<uint8_t*>(malloc(buf_size));
memcpy(buf, data, buf_size);
- CPDF_Stream* stream_val =
- arr->InsertNewAt<CPDF_Stream>(13, buf, buf_size, stream_dict);
+ CPDF_Stream* stream_val = arr->InsertNewAt<CPDF_Stream>(
+ 13, buf, buf_size, pdfium::WrapUnique(stream_dict));
const char* const expected_str[] = {
"true", "false", "0", "-1234", "2345", "0.05", "",
"It is a test!", "NAME", "test", "", "", "", ""};
@@ -816,10 +819,12 @@ TEST(PDFObjectTest, CloneCheckLoop) {
EXPECT_EQ(nullptr, cloned_dict->AsDictionary()->GetObjectFor("arr"));
}
{
- // Create a dictionary/stream pair with a reference loop.
+ // Create a dictionary/stream pair with a reference loop. It takes
+ // some work to do this nowadays, in particular we need the
+ // anti-pattern pdfium::WrapUnique(dict.get()).
auto dict_obj = pdfium::MakeUnique<CPDF_Dictionary>();
- CPDF_Stream* stream_obj =
- dict_obj->SetNewFor<CPDF_Stream>("stream", nullptr, 0, dict_obj.get());
+ CPDF_Stream* stream_obj = dict_obj->SetNewFor<CPDF_Stream>(
+ "stream", nullptr, 0, pdfium::WrapUnique(dict_obj.get()));
// Clone this object to see whether stack overflow will be triggered.
std::unique_ptr<CPDF_Stream> cloned_stream = ToStream(stream_obj->Clone());
// Cloned object should be the same as the original.
diff --git a/core/fpdfapi/parser/cpdf_stream.cpp b/core/fpdfapi/parser/cpdf_stream.cpp
index fd7f08f688..7a54fcf8ff 100644
--- a/core/fpdfapi/parser/cpdf_stream.cpp
+++ b/core/fpdfapi/parser/cpdf_stream.cpp
@@ -6,6 +6,8 @@
#include "core/fpdfapi/parser/cpdf_stream.h"
+#include <utility>
+
#include "core/fpdfapi/parser/cpdf_dictionary.h"
#include "core/fpdfapi/parser/cpdf_number.h"
#include "core/fpdfapi/parser/cpdf_stream_acc.h"
@@ -15,8 +17,10 @@
CPDF_Stream::CPDF_Stream() {}
-CPDF_Stream::CPDF_Stream(uint8_t* pData, uint32_t size, CPDF_Dictionary* pDict)
- : m_dwSize(size), m_pDict(pDict), m_pDataBuf(pData) {}
+CPDF_Stream::CPDF_Stream(uint8_t* pData,
+ uint32_t size,
+ std::unique_ptr<CPDF_Dictionary> pDict)
+ : m_dwSize(size), m_pDict(std::move(pDict)), m_pDataBuf(pData) {}
CPDF_Stream::~CPDF_Stream() {
m_ObjNum = kInvalidObjNum;
@@ -46,8 +50,8 @@ const CPDF_Stream* CPDF_Stream::AsStream() const {
void CPDF_Stream::InitStream(const uint8_t* pData,
uint32_t size,
- CPDF_Dictionary* pDict) {
- m_pDict.reset(pDict);
+ std::unique_ptr<CPDF_Dictionary> pDict) {
+ m_pDict = std::move(pDict);
m_bMemoryBased = true;
m_pFile = nullptr;
m_pDataBuf.reset(FX_Alloc(uint8_t, size));
@@ -59,8 +63,8 @@ void CPDF_Stream::InitStream(const uint8_t* pData,
}
void CPDF_Stream::InitStreamFromFile(IFX_SeekableReadStream* pFile,
- CPDF_Dictionary* pDict) {
- m_pDict.reset(pDict);
+ std::unique_ptr<CPDF_Dictionary> pDict) {
+ m_pDict = std::move(pDict);
m_bMemoryBased = false;
m_pDataBuf.reset();
m_pFile = pFile;
@@ -79,14 +83,16 @@ std::unique_ptr<CPDF_Object> CPDF_Stream::CloneNonCyclic(
pVisited->insert(this);
CPDF_StreamAcc acc;
acc.LoadAllData(this, true);
+
uint32_t streamSize = acc.GetSize();
CPDF_Dictionary* pDict = GetDict();
+ std::unique_ptr<CPDF_Dictionary> pNewDict;
if (pDict && !pdfium::ContainsKey(*pVisited, pDict)) {
- pDict = ToDictionary(static_cast<CPDF_Object*>(pDict)
- ->CloneNonCyclic(bDirect, pVisited)
- .release());
+ pNewDict = ToDictionary(
+ static_cast<CPDF_Object*>(pDict)->CloneNonCyclic(bDirect, pVisited));
}
- return pdfium::MakeUnique<CPDF_Stream>(acc.DetachData(), streamSize, pDict);
+ return pdfium::MakeUnique<CPDF_Stream>(acc.DetachData(), streamSize,
+ std::move(pNewDict));
}
void CPDF_Stream::SetData(const uint8_t* pData, uint32_t size) {
diff --git a/core/fpdfapi/parser/cpdf_stream.h b/core/fpdfapi/parser/cpdf_stream.h
index c4f9aacf2b..fb2b67cd82 100644
--- a/core/fpdfapi/parser/cpdf_stream.h
+++ b/core/fpdfapi/parser/cpdf_stream.h
@@ -18,8 +18,11 @@ class CPDF_Stream : public CPDF_Object {
public:
CPDF_Stream();
- // Takes ownership of |pData| and |pDict|.
- CPDF_Stream(uint8_t* pData, uint32_t size, CPDF_Dictionary* pDict);
+ // Takes ownership of |pData|.
+ CPDF_Stream(uint8_t* pData,
+ uint32_t size,
+ std::unique_ptr<CPDF_Dictionary> pDict);
+
~CPDF_Stream() override;
// CPDF_Object:
@@ -37,9 +40,11 @@ class CPDF_Stream : public CPDF_Object {
// Does not takes onwership of |pData|, copies into internally-owned buffer.
void SetData(const uint8_t* pData, uint32_t size);
- void InitStream(const uint8_t* pData, uint32_t size, CPDF_Dictionary* pDict);
+ void InitStream(const uint8_t* pData,
+ uint32_t size,
+ std::unique_ptr<CPDF_Dictionary> pDict);
void InitStreamFromFile(IFX_SeekableReadStream* pFile,
- CPDF_Dictionary* pDict);
+ std::unique_ptr<CPDF_Dictionary> pDict);
bool ReadRawData(FX_FILESIZE start_pos,
uint8_t* pBuf,
diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.cpp b/core/fpdfapi/parser/cpdf_syntax_parser.cpp
index 4a0fd3a408..17e4954f2a 100644
--- a/core/fpdfapi/parser/cpdf_syntax_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_syntax_parser.cpp
@@ -752,7 +752,8 @@ std::unique_ptr<CPDF_Stream> CPDF_SyntaxParser::ReadStream(
}
}
- auto pStream = pdfium::MakeUnique<CPDF_Stream>(pData, len, pDict);
+ auto pStream =
+ pdfium::MakeUnique<CPDF_Stream>(pData, len, pdfium::WrapUnique(pDict));
streamStartPos = m_Pos;
FXSYS_memset(m_WordBuffer, 0, kEndObjStr.GetLength() + 1);
GetNextWordInternal(nullptr);