Pass retained references to CPDF_ReadValidator
Bug: pdfium:1843
Change-Id: I1cab128a2ead7e49f245d18e04a4cc31ffff02f1
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/95994
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp
index fefa46b..b2d1f5c 100644
--- a/core/fpdfapi/parser/cpdf_document.cpp
+++ b/core/fpdfapi/parser/cpdf_document.cpp
@@ -153,12 +153,13 @@
}
CPDF_Parser::Error CPDF_Document::LoadLinearizedDoc(
- const RetainPtr<CPDF_ReadValidator>& validator,
+ RetainPtr<CPDF_ReadValidator> validator,
const ByteString& password) {
if (!m_pParser)
SetParser(std::make_unique<CPDF_Parser>(this));
- return HandleLoadResult(m_pParser->StartLinearizedParse(validator, password));
+ return HandleLoadResult(
+ m_pParser->StartLinearizedParse(std::move(validator), password));
}
void CPDF_Document::LoadPages() {
diff --git a/core/fpdfapi/parser/cpdf_document.h b/core/fpdfapi/parser/cpdf_document.h
index 0483940..ccd393b 100644
--- a/core/fpdfapi/parser/cpdf_document.h
+++ b/core/fpdfapi/parser/cpdf_document.h
@@ -128,9 +128,8 @@
CPDF_Parser::Error LoadDoc(
const RetainPtr<IFX_SeekableReadStream>& pFileAccess,
const ByteString& password);
- CPDF_Parser::Error LoadLinearizedDoc(
- const RetainPtr<CPDF_ReadValidator>& validator,
- const ByteString& password);
+ CPDF_Parser::Error LoadLinearizedDoc(RetainPtr<CPDF_ReadValidator> validator,
+ const ByteString& password);
bool has_valid_cross_reference_table() const {
return m_bHasValidCrossReferenceTable;
}
diff --git a/core/fpdfapi/parser/cpdf_object_avail.cpp b/core/fpdfapi/parser/cpdf_object_avail.cpp
index 73e3833..f9fff08 100644
--- a/core/fpdfapi/parser/cpdf_object_avail.cpp
+++ b/core/fpdfapi/parser/cpdf_object_avail.cpp
@@ -14,11 +14,10 @@
#include "third_party/base/check.h"
#include "third_party/base/containers/contains.h"
-CPDF_ObjectAvail::CPDF_ObjectAvail(
- const RetainPtr<CPDF_ReadValidator>& validator,
- CPDF_IndirectObjectHolder* holder,
- const CPDF_Object* root)
- : validator_(validator), holder_(holder), root_(root) {
+CPDF_ObjectAvail::CPDF_ObjectAvail(RetainPtr<CPDF_ReadValidator> validator,
+ CPDF_IndirectObjectHolder* holder,
+ const CPDF_Object* root)
+ : validator_(std::move(validator)), holder_(holder), root_(root) {
DCHECK(validator_);
DCHECK(holder);
DCHECK(root_);
@@ -26,11 +25,10 @@
parsed_objnums_.insert(root_->GetObjNum());
}
-CPDF_ObjectAvail::CPDF_ObjectAvail(
- const RetainPtr<CPDF_ReadValidator>& validator,
- CPDF_IndirectObjectHolder* holder,
- uint32_t obj_num)
- : validator_(validator),
+CPDF_ObjectAvail::CPDF_ObjectAvail(RetainPtr<CPDF_ReadValidator> validator,
+ CPDF_IndirectObjectHolder* holder,
+ uint32_t obj_num)
+ : validator_(std::move(validator)),
holder_(holder),
root_(pdfium::MakeRetain<CPDF_Reference>(holder, obj_num)) {
DCHECK(validator_);
diff --git a/core/fpdfapi/parser/cpdf_object_avail.h b/core/fpdfapi/parser/cpdf_object_avail.h
index a8f5c6f..f7ce7b3 100644
--- a/core/fpdfapi/parser/cpdf_object_avail.h
+++ b/core/fpdfapi/parser/cpdf_object_avail.h
@@ -19,10 +19,10 @@
// Helper for check availability of object tree.
class CPDF_ObjectAvail {
public:
- CPDF_ObjectAvail(const RetainPtr<CPDF_ReadValidator>& validator,
+ CPDF_ObjectAvail(RetainPtr<CPDF_ReadValidator> validator,
CPDF_IndirectObjectHolder* holder,
const CPDF_Object* root);
- CPDF_ObjectAvail(const RetainPtr<CPDF_ReadValidator>& validator,
+ CPDF_ObjectAvail(RetainPtr<CPDF_ReadValidator> validator,
CPDF_IndirectObjectHolder* holder,
uint32_t obj_num);
virtual ~CPDF_ObjectAvail();
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp
index 2eecb88..649b474 100644
--- a/core/fpdfapi/parser/cpdf_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_parser.cpp
@@ -177,16 +177,15 @@
m_CrossRefTable->ShrinkObjectMap(size);
}
-bool CPDF_Parser::InitSyntaxParser(
- const RetainPtr<CPDF_ReadValidator>& validator) {
+bool CPDF_Parser::InitSyntaxParser(RetainPtr<CPDF_ReadValidator> validator) {
const absl::optional<FX_FILESIZE> header_offset = GetHeaderOffset(validator);
if (!header_offset.has_value())
return false;
if (validator->GetSize() < header_offset.value() + kPDFHeaderSize)
return false;
- m_pSyntax =
- std::make_unique<CPDF_SyntaxParser>(validator, header_offset.value());
+ m_pSyntax = std::make_unique<CPDF_SyntaxParser>(std::move(validator),
+ header_offset.value());
return ParseFileVersion();
}
@@ -1016,7 +1015,7 @@
}
CPDF_Parser::Error CPDF_Parser::StartLinearizedParse(
- const RetainPtr<CPDF_ReadValidator>& validator,
+ RetainPtr<CPDF_ReadValidator> validator,
const ByteString& password) {
DCHECK(!m_bHasParsed);
DCHECK(!m_bXRefTableRebuilt);
@@ -1024,7 +1023,7 @@
m_bXRefStream = false;
m_LastXRefOffset = 0;
- if (!InitSyntaxParser(validator))
+ if (!InitSyntaxParser(std::move(validator)))
return FORMAT_ERROR;
m_pLinearized = ParseLinearizedHeader();
diff --git a/core/fpdfapi/parser/cpdf_parser.h b/core/fpdfapi/parser/cpdf_parser.h
index 559850e..a68346d 100644
--- a/core/fpdfapi/parser/cpdf_parser.h
+++ b/core/fpdfapi/parser/cpdf_parser.h
@@ -66,7 +66,7 @@
Error StartParse(const RetainPtr<IFX_SeekableReadStream>& pFile,
const ByteString& password);
- Error StartLinearizedParse(const RetainPtr<CPDF_ReadValidator>& validator,
+ Error StartLinearizedParse(RetainPtr<CPDF_ReadValidator> validator,
const ByteString& password);
void SetPassword(const ByteString& password) { m_Password = password; }
@@ -170,7 +170,7 @@
bool ParseCrossRefV4(std::vector<CrossRefObjData>* out_objects);
void MergeCrossRefObjectsData(const std::vector<CrossRefObjData>& objects);
- bool InitSyntaxParser(const RetainPtr<CPDF_ReadValidator>& validator);
+ bool InitSyntaxParser(RetainPtr<CPDF_ReadValidator> validator);
bool ParseFileVersion();
ObjectType GetObjectType(uint32_t objnum) const;
diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.cpp b/core/fpdfapi/parser/cpdf_syntax_parser.cpp
index 55669c9..01210b9 100644
--- a/core/fpdfapi/parser/cpdf_syntax_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_syntax_parser.cpp
@@ -93,10 +93,9 @@
pdfium::MakeRetain<CPDF_ReadValidator>(pFileAccess, nullptr),
0) {}
-CPDF_SyntaxParser::CPDF_SyntaxParser(
- const RetainPtr<CPDF_ReadValidator>& validator,
- FX_FILESIZE HeaderOffset)
- : m_pFileAccess(validator),
+CPDF_SyntaxParser::CPDF_SyntaxParser(RetainPtr<CPDF_ReadValidator> validator,
+ FX_FILESIZE HeaderOffset)
+ : m_pFileAccess(std::move(validator)),
m_HeaderOffset(HeaderOffset),
m_FileLen(m_pFileAccess->GetSize()) {
DCHECK(m_HeaderOffset <= m_FileLen);
@@ -823,6 +822,10 @@
return FXSYS_atoui(reinterpret_cast<const char*>(m_WordBuffer));
}
+RetainPtr<CPDF_ReadValidator> CPDF_SyntaxParser::GetValidator() const {
+ return m_pFileAccess;
+}
+
bool CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos,
FX_FILESIZE limit,
ByteStringView tag,
diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.h b/core/fpdfapi/parser/cpdf_syntax_parser.h
index b7bcecd..46e1e9a 100644
--- a/core/fpdfapi/parser/cpdf_syntax_parser.h
+++ b/core/fpdfapi/parser/cpdf_syntax_parser.h
@@ -42,7 +42,7 @@
explicit CPDF_SyntaxParser(
const RetainPtr<IFX_SeekableReadStream>& pFileAccess);
- CPDF_SyntaxParser(const RetainPtr<CPDF_ReadValidator>& pValidator,
+ CPDF_SyntaxParser(RetainPtr<CPDF_ReadValidator> pValidator,
FX_FILESIZE HeaderOffset);
~CPDF_SyntaxParser();
@@ -69,9 +69,7 @@
WordResult GetNextWord();
ByteString PeekNextWord();
- const RetainPtr<CPDF_ReadValidator>& GetValidator() const {
- return m_pFileAccess;
- }
+ RetainPtr<CPDF_ReadValidator> GetValidator() const;
uint32_t GetDirectNum();
bool GetNextChar(uint8_t& ch);