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,