Make CPDF_SecurityHandler retainable.
Avoids another instance of MaybeOwned<>.
Change-Id: I3e6a07161f455a500b004de67295e4e269c1543e
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/53752
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/edit/cpdf_creator.cpp b/core/fpdfapi/edit/cpdf_creator.cpp
index 3915c1b..c815f8f 100644
--- a/core/fpdfapi/edit/cpdf_creator.cpp
+++ b/core/fpdfapi/edit/cpdf_creator.cpp
@@ -620,7 +620,7 @@
if (m_pEncryptDict->GetStringFor("Filter") == "Standard") {
m_pNewEncryptDict = ToDictionary(m_pEncryptDict->Clone());
m_pEncryptDict = m_pNewEncryptDict.get();
- m_pSecurityHandler = pdfium::MakeUnique<CPDF_SecurityHandler>();
+ m_pSecurityHandler = pdfium::MakeRetain<CPDF_SecurityHandler>();
m_pSecurityHandler->OnCreate(m_pNewEncryptDict.get(), m_pIDArray.get(),
m_pParser->GetPassword());
m_bSecurityChanged = true;
diff --git a/core/fpdfapi/edit/cpdf_creator.h b/core/fpdfapi/edit/cpdf_creator.h
index ef81805..64b2e4d 100644
--- a/core/fpdfapi/edit/cpdf_creator.h
+++ b/core/fpdfapi/edit/cpdf_creator.h
@@ -12,7 +12,6 @@
#include <vector>
#include "core/fxcrt/fx_stream.h"
-#include "core/fxcrt/maybe_owned.h"
#include "core/fxcrt/retain_ptr.h"
#include "core/fxcrt/unowned_ptr.h"
@@ -77,7 +76,7 @@
UnownedPtr<const CPDF_Parser> const m_pParser;
UnownedPtr<const CPDF_Dictionary> m_pEncryptDict;
std::unique_ptr<CPDF_Dictionary> m_pNewEncryptDict;
- fxcrt::MaybeOwned<CPDF_SecurityHandler> m_pSecurityHandler;
+ RetainPtr<CPDF_SecurityHandler> m_pSecurityHandler;
UnownedPtr<const CPDF_Object> m_pMetadata;
uint32_t m_dwLastObjNum;
std::unique_ptr<IFX_ArchiveStream> m_Archive;
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp
index 02cb08e..2a7852c 100644
--- a/core/fpdfapi/parser/cpdf_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_parser.cpp
@@ -251,8 +251,7 @@
if (pEncryptDict->GetStringFor("Filter") != "Standard")
return HANDLER_ERROR;
- std::unique_ptr<CPDF_SecurityHandler> pSecurityHandler =
- pdfium::MakeUnique<CPDF_SecurityHandler>();
+ auto pSecurityHandler = pdfium::MakeRetain<CPDF_SecurityHandler>();
if (!pSecurityHandler->OnInit(pEncryptDict, GetIDArray(), m_Password))
return PASSWORD_ERROR;
@@ -261,7 +260,7 @@
}
void CPDF_Parser::ReleaseEncryptHandler() {
- m_pSecurityHandler.reset();
+ m_pSecurityHandler.Reset();
}
// Ideally, all the cross reference entries should be verified.
diff --git a/core/fpdfapi/parser/cpdf_parser.h b/core/fpdfapi/parser/cpdf_parser.h
index 74b6717..b7b63e4 100644
--- a/core/fpdfapi/parser/cpdf_parser.h
+++ b/core/fpdfapi/parser/cpdf_parser.h
@@ -90,8 +90,8 @@
FX_FILESIZE GetObjectPositionOrZero(uint32_t objnum) const;
uint16_t GetObjectGenNum(uint32_t objnum) const;
bool IsObjectFreeOrNull(uint32_t objnum) const;
- CPDF_SecurityHandler* GetSecurityHandler() const {
- return m_pSecurityHandler.get();
+ const RetainPtr<CPDF_SecurityHandler>& GetSecurityHandler() const {
+ return m_pSecurityHandler;
}
bool IsObjectFree(uint32_t objnum) const;
@@ -183,7 +183,7 @@
// ownership of the ID array data.
std::unique_ptr<CPDF_CrossRefTable> m_CrossRefTable;
FX_FILESIZE m_LastXRefOffset;
- std::unique_ptr<CPDF_SecurityHandler> m_pSecurityHandler;
+ RetainPtr<CPDF_SecurityHandler> m_pSecurityHandler;
ByteString m_Password;
std::unique_ptr<CPDF_LinearizedHeader> m_pLinearized;
diff --git a/core/fpdfapi/parser/cpdf_security_handler.h b/core/fpdfapi/parser/cpdf_security_handler.h
index 8dcf009..cbb8b15 100644
--- a/core/fpdfapi/parser/cpdf_security_handler.h
+++ b/core/fpdfapi/parser/cpdf_security_handler.h
@@ -11,6 +11,7 @@
#include "core/fxcrt/fx_string.h"
#include "core/fxcrt/fx_system.h"
+#include "core/fxcrt/retain_ptr.h"
#define FXCIPHER_NONE 0
#define FXCIPHER_RC4 1
@@ -22,10 +23,10 @@
class CPDF_Dictionary;
class CPDF_Parser;
-class CPDF_SecurityHandler {
+class CPDF_SecurityHandler : public Retainable {
public:
- CPDF_SecurityHandler();
- ~CPDF_SecurityHandler();
+ template <typename T, typename... Args>
+ friend RetainPtr<T> pdfium::MakeRetain(Args&&... args);
bool OnInit(const CPDF_Dictionary* pEncryptDict,
const CPDF_Array* pIdArray,
@@ -46,6 +47,9 @@
}
private:
+ CPDF_SecurityHandler();
+ ~CPDF_SecurityHandler() override;
+
bool LoadDict(const CPDF_Dictionary* pEncryptDict);
bool LoadDict(const CPDF_Dictionary* pEncryptDict,
int& cipher,