Store retained object keys in all CPDF_DocPageData maps. Then propagate changes to callers as necessary, Change-Id: I8dc79f86e85e5015703ed3f1a4a49df219be5535 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/98235 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 76c9e93..641afff 100644 --- a/core/fpdfapi/edit/cpdf_creator.cpp +++ b/core/fpdfapi/edit/cpdf_creator.cpp
@@ -564,7 +564,8 @@ DCHECK(!m_pIDArray); m_pIDArray = pdfium::MakeRetain<CPDF_Array>(); - const CPDF_Array* pOldIDArray = m_pParser ? m_pParser->GetIDArray() : nullptr; + RetainPtr<const CPDF_Array> pOldIDArray = + m_pParser ? m_pParser->GetIDArray() : nullptr; RetainPtr<const CPDF_Object> pID1 = pOldIDArray ? pOldIDArray->GetObjectAt(0) : nullptr; if (pID1) {
diff --git a/core/fpdfapi/page/cpdf_colorspace.cpp b/core/fpdfapi/page/cpdf_colorspace.cpp index e0a56c1..89cb55a 100644 --- a/core/fpdfapi/page/cpdf_colorspace.cpp +++ b/core/fpdfapi/page/cpdf_colorspace.cpp
@@ -907,8 +907,7 @@ return 0; uint32_t nComponents = static_cast<uint32_t>(nDictComponents); - m_pProfile = - CPDF_DocPageData::FromDocument(pDoc)->GetIccProfile(pStream.Get()); + m_pProfile = CPDF_DocPageData::FromDocument(pDoc)->GetIccProfile(pStream); if (!m_pProfile) return 0;
diff --git a/core/fpdfapi/page/cpdf_docpagedata.cpp b/core/fpdfapi/page/cpdf_docpagedata.cpp index 4b0277247..7ff7952 100644 --- a/core/fpdfapi/page/cpdf_docpagedata.cpp +++ b/core/fpdfapi/page/cpdf_docpagedata.cpp
@@ -182,7 +182,7 @@ if (!pFontDict) return nullptr; - auto it = m_FontMap.find(pFontDict.Get()); + auto it = m_FontMap.find(pFontDict); if (it != m_FontMap.end() && it->second) return pdfium::WrapRetain(it->second.Get()); @@ -191,7 +191,7 @@ if (!pFont) return nullptr; - m_FontMap[pFontDict.Get()].Reset(pFont.Get()); + m_FontMap[std::move(pFontDict)].Reset(pFont.Get()); return pFont; } @@ -235,7 +235,7 @@ if (!pFont) return nullptr; - m_FontMap[pDict.Get()].Reset(pFont.Get()); + m_FontMap[std::move(pDict)].Reset(pFont.Get()); return pFont; } @@ -307,7 +307,7 @@ pVisitedInternal); } - const CPDF_Array* pArray = pCSObj->AsArray(); + RetainPtr<const CPDF_Array> pArray(pCSObj->AsArray()); if (!pArray || pArray->IsEmpty()) return nullptr; @@ -316,21 +316,22 @@ pVisited, pVisitedInternal); } - auto it = m_ColorSpaceMap.find(pCSObj); + auto it = m_ColorSpaceMap.find(pArray); if (it != m_ColorSpaceMap.end() && it->second) return pdfium::WrapRetain(it->second.Get()); RetainPtr<CPDF_ColorSpace> pCS = - CPDF_ColorSpace::Load(GetDocument(), pArray, pVisited); + CPDF_ColorSpace::Load(GetDocument(), pArray.Get(), pVisited); if (!pCS) return nullptr; - m_ColorSpaceMap[pCSObj].Reset(pCS.Get()); + m_ColorSpaceMap[std::move(pArray)].Reset(pCS.Get()); return pCS; } -RetainPtr<CPDF_Pattern> CPDF_DocPageData::GetPattern(CPDF_Object* pPatternObj, - const CFX_Matrix& matrix) { +RetainPtr<CPDF_Pattern> CPDF_DocPageData::GetPattern( + RetainPtr<CPDF_Object> pPatternObj, + const CFX_Matrix& matrix) { if (!pPatternObj) return nullptr; @@ -358,7 +359,7 @@ } RetainPtr<CPDF_ShadingPattern> CPDF_DocPageData::GetShading( - CPDF_Object* pPatternObj, + RetainPtr<CPDF_Object> pPatternObj, const CFX_Matrix& matrix) { if (!pPatternObj) return nullptr; @@ -392,7 +393,7 @@ } RetainPtr<CPDF_IccProfile> CPDF_DocPageData::GetIccProfile( - const CPDF_Stream* pProfileStream) { + RetainPtr<const CPDF_Stream> pProfileStream) { if (!pProfileStream) return nullptr; @@ -400,21 +401,20 @@ if (it != m_IccProfileMap.end() && it->second) return pdfium::WrapRetain(it->second.Get()); - auto pAccessor = - pdfium::MakeRetain<CPDF_StreamAcc>(pdfium::WrapRetain(pProfileStream)); + auto pAccessor = pdfium::MakeRetain<CPDF_StreamAcc>(pProfileStream); pAccessor->LoadAllDataFiltered(); ByteString bsDigest = pAccessor->ComputeDigest(); auto hash_it = m_HashProfileMap.find(bsDigest); if (hash_it != m_HashProfileMap.end()) { - auto it_copied_stream = m_IccProfileMap.find(hash_it->second.Get()); + auto it_copied_stream = m_IccProfileMap.find(hash_it->second); if (it_copied_stream != m_IccProfileMap.end() && it_copied_stream->second) return pdfium::WrapRetain(it_copied_stream->second.Get()); } auto pProfile = pdfium::MakeRetain<CPDF_IccProfile>(pProfileStream, pAccessor->GetSpan()); m_IccProfileMap[pProfileStream].Reset(pProfile.Get()); - m_HashProfileMap[bsDigest].Reset(pProfileStream); + m_HashProfileMap[bsDigest] = std::move(pProfileStream); return pProfile; }
diff --git a/core/fpdfapi/page/cpdf_docpagedata.h b/core/fpdfapi/page/cpdf_docpagedata.h index d6fbb52..8767392 100644 --- a/core/fpdfapi/page/cpdf_docpagedata.h +++ b/core/fpdfapi/page/cpdf_docpagedata.h
@@ -76,15 +76,16 @@ const CPDF_Dictionary* pResources, std::set<const CPDF_Object*>* pVisited); - RetainPtr<CPDF_Pattern> GetPattern(CPDF_Object* pPatternObj, + RetainPtr<CPDF_Pattern> GetPattern(RetainPtr<CPDF_Object> pPatternObj, const CFX_Matrix& matrix); - RetainPtr<CPDF_ShadingPattern> GetShading(CPDF_Object* pPatternObj, + RetainPtr<CPDF_ShadingPattern> GetShading(RetainPtr<CPDF_Object> pPatternObj, const CFX_Matrix& matrix); RetainPtr<CPDF_Image> GetImage(uint32_t dwStreamObjNum); void MaybePurgeImage(uint32_t dwStreamObjNum); - RetainPtr<CPDF_IccProfile> GetIccProfile(const CPDF_Stream* pProfileStream); + RetainPtr<CPDF_IccProfile> GetIccProfile( + RetainPtr<const CPDF_Stream> pProfileStream); private: // Loads a colorspace in a context that might be while loading another @@ -109,13 +110,16 @@ // Specific destruction order may be required between maps. std::map<ByteString, RetainPtr<const CPDF_Stream>> m_HashProfileMap; - std::map<const CPDF_Object*, ObservedPtr<CPDF_ColorSpace>> m_ColorSpaceMap; + std::map<RetainPtr<const CPDF_Array>, ObservedPtr<CPDF_ColorSpace>> + m_ColorSpaceMap; std::map<RetainPtr<const CPDF_Stream>, RetainPtr<CPDF_StreamAcc>> m_FontFileMap; - std::map<const CPDF_Stream*, ObservedPtr<CPDF_IccProfile>> m_IccProfileMap; - std::map<const CPDF_Object*, ObservedPtr<CPDF_Pattern>> m_PatternMap; + std::map<RetainPtr<const CPDF_Stream>, ObservedPtr<CPDF_IccProfile>> + m_IccProfileMap; + std::map<RetainPtr<const CPDF_Object>, ObservedPtr<CPDF_Pattern>> + m_PatternMap; std::map<uint32_t, RetainPtr<CPDF_Image>> m_ImageMap; - std::map<const CPDF_Dictionary*, ObservedPtr<CPDF_Font>> m_FontMap; + std::map<RetainPtr<const CPDF_Dictionary>, ObservedPtr<CPDF_Font>> m_FontMap; }; #endif // CORE_FPDFAPI_PAGE_CPDF_DOCPAGEDATA_H_
diff --git a/core/fpdfapi/page/cpdf_iccprofile.cpp b/core/fpdfapi/page/cpdf_iccprofile.cpp index 8f335cc..4a4988f 100644 --- a/core/fpdfapi/page/cpdf_iccprofile.cpp +++ b/core/fpdfapi/page/cpdf_iccprofile.cpp
@@ -6,6 +6,8 @@ #include "core/fpdfapi/page/cpdf_iccprofile.h" +#include <utility> + #include "core/fpdfapi/parser/cpdf_stream.h" #include "core/fxcodec/icc/icc_transform.h" @@ -18,9 +20,9 @@ } // namespace -CPDF_IccProfile::CPDF_IccProfile(const CPDF_Stream* pStream, +CPDF_IccProfile::CPDF_IccProfile(RetainPtr<const CPDF_Stream> pStream, pdfium::span<const uint8_t> span) - : m_bsRGB(DetectSRGB(span)), m_pStream(pStream) { + : m_bsRGB(DetectSRGB(span)), m_pStream(std::move(pStream)) { if (m_bsRGB) { m_nSrcComponents = 3; return;
diff --git a/core/fpdfapi/page/cpdf_iccprofile.h b/core/fpdfapi/page/cpdf_iccprofile.h index 5db7b06..3ff9421 100644 --- a/core/fpdfapi/page/cpdf_iccprofile.h +++ b/core/fpdfapi/page/cpdf_iccprofile.h
@@ -39,7 +39,8 @@ private: // Keeps stream alive for the duration of the CPDF_IccProfile. - CPDF_IccProfile(const CPDF_Stream* pStream, pdfium::span<const uint8_t> span); + CPDF_IccProfile(RetainPtr<const CPDF_Stream> pStream, + pdfium::span<const uint8_t> span); ~CPDF_IccProfile() override; const bool m_bsRGB;
diff --git a/core/fpdfapi/page/cpdf_pattern.cpp b/core/fpdfapi/page/cpdf_pattern.cpp index 5477b06..ce7c767 100644 --- a/core/fpdfapi/page/cpdf_pattern.cpp +++ b/core/fpdfapi/page/cpdf_pattern.cpp
@@ -6,13 +6,17 @@ #include "core/fpdfapi/page/cpdf_pattern.h" +#include <utility> + #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "third_party/base/check.h" CPDF_Pattern::CPDF_Pattern(CPDF_Document* pDoc, - CPDF_Object* pObj, + RetainPtr<CPDF_Object> pObj, const CFX_Matrix& parentMatrix) - : m_pDocument(pDoc), m_pPatternObj(pObj), m_ParentMatrix(parentMatrix) { + : m_pDocument(pDoc), + m_pPatternObj(std::move(pObj)), + m_ParentMatrix(parentMatrix) { DCHECK(m_pDocument); DCHECK(m_pPatternObj); }
diff --git a/core/fpdfapi/page/cpdf_pattern.h b/core/fpdfapi/page/cpdf_pattern.h index f455f77..36d64ad 100644 --- a/core/fpdfapi/page/cpdf_pattern.h +++ b/core/fpdfapi/page/cpdf_pattern.h
@@ -35,7 +35,7 @@ protected: CPDF_Pattern(CPDF_Document* pDoc, - CPDF_Object* pObj, + RetainPtr<CPDF_Object> pObj, const CFX_Matrix& parentMatrix); void SetPatternToFormMatrix();
diff --git a/core/fpdfapi/page/cpdf_shadingpattern.cpp b/core/fpdfapi/page/cpdf_shadingpattern.cpp index e58c88b..aa73f5d 100644 --- a/core/fpdfapi/page/cpdf_shadingpattern.cpp +++ b/core/fpdfapi/page/cpdf_shadingpattern.cpp
@@ -7,6 +7,7 @@ #include "core/fpdfapi/page/cpdf_shadingpattern.h" #include <algorithm> +#include <utility> #include "core/fpdfapi/page/cpdf_docpagedata.h" #include "core/fpdfapi/page/cpdf_function.h" @@ -30,10 +31,11 @@ } // namespace CPDF_ShadingPattern::CPDF_ShadingPattern(CPDF_Document* pDoc, - CPDF_Object* pPatternObj, + RetainPtr<CPDF_Object> pPatternObj, bool bShading, const CFX_Matrix& parentMatrix) - : CPDF_Pattern(pDoc, pPatternObj, parentMatrix), m_bShading(bShading) { + : CPDF_Pattern(pDoc, std::move(pPatternObj), parentMatrix), + m_bShading(bShading) { DCHECK(document()); if (!bShading) SetPatternToFormMatrix();
diff --git a/core/fpdfapi/page/cpdf_shadingpattern.h b/core/fpdfapi/page/cpdf_shadingpattern.h index 4e5608b..2a99d4e 100644 --- a/core/fpdfapi/page/cpdf_shadingpattern.h +++ b/core/fpdfapi/page/cpdf_shadingpattern.h
@@ -62,7 +62,7 @@ private: CPDF_ShadingPattern(CPDF_Document* pDoc, - CPDF_Object* pPatternObj, + RetainPtr<CPDF_Object> pPatternObj, bool bShading, const CFX_Matrix& parentMatrix); CPDF_ShadingPattern(const CPDF_ShadingPattern&) = delete;
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp index 0094d40..89e8692 100644 --- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp +++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -586,10 +586,11 @@ if (pProperty->IsName()) { ByteString property_name = pProperty->GetString(); - CPDF_Dictionary* pHolder = FindResourceHolder("Properties"); + RetainPtr<CPDF_Dictionary> pHolder = FindResourceHolder("Properties"); if (!pHolder || !pHolder->GetDictFor(property_name)) return; - new_marks->AddMarkWithPropertiesHolder(tag, pHolder, property_name); + // TODO(tsepez): pass retained argument. + new_marks->AddMarkWithPropertiesHolder(tag, pHolder.Get(), property_name); } else if (pProperty->IsDictionary()) { new_marks->AddMarkWithDirectDict(tag, pProperty->AsMutableDictionary()); } else { @@ -629,7 +630,7 @@ if (pCSObj->IsName()) { ByteString name = pCSObj->GetString(); if (name != "DeviceRGB" && name != "DeviceGray" && name != "DeviceCMYK") { - pCSObj.Reset(FindResourceObj("ColorSpace", name)); + pCSObj = FindResourceObj("ColorSpace", name); if (pCSObj && pCSObj->IsInline()) pDict->SetFor("ColorSpace", pCSObj->Clone()); } @@ -886,11 +887,12 @@ void CPDF_StreamContentParser::Handle_SetExtendGraphState() { ByteString name = GetString(0); - CPDF_Dictionary* pGS = ToDictionary(FindResourceObj("ExtGState", name)); + RetainPtr<CPDF_Dictionary> pGS = + ToDictionary(FindResourceObj("ExtGState", name)); if (!pGS) return; - m_pCurStates->ProcessExtGS(pGS, this); + m_pCurStates->ProcessExtGS(pGS.Get(), this); } void CPDF_StreamContentParser::Handle_ClosePath() { @@ -1113,26 +1115,26 @@ m_pCurStates->m_TextState.SetFont(std::move(pFont)); } -CPDF_Dictionary* CPDF_StreamContentParser::FindResourceHolder( +RetainPtr<CPDF_Dictionary> CPDF_StreamContentParser::FindResourceHolder( const ByteString& type) { if (!m_pResources) return nullptr; RetainPtr<CPDF_Dictionary> pDict = m_pResources->GetMutableDictFor(type); if (pDict) - return pDict.Get(); // TODO(tsepez): return retained and below. + return pDict; if (m_pResources == m_pPageResources || !m_pPageResources) return nullptr; - return m_pPageResources->GetMutableDictFor(type).Get(); + return m_pPageResources->GetMutableDictFor(type); } -// TODO(tsepez): return retained reference. -CPDF_Object* CPDF_StreamContentParser::FindResourceObj(const ByteString& type, - const ByteString& name) { - CPDF_Dictionary* pHolder = FindResourceHolder(type); - return pHolder ? pHolder->GetMutableDirectObjectFor(name).Get() : nullptr; +RetainPtr<CPDF_Object> CPDF_StreamContentParser::FindResourceObj( + const ByteString& type, + const ByteString& name) { + RetainPtr<CPDF_Dictionary> pHolder = FindResourceHolder(type); + return pHolder ? pHolder->GetMutableDirectObjectFor(name) : nullptr; } RetainPtr<CPDF_Font> CPDF_StreamContentParser::FindFont( @@ -1160,7 +1162,8 @@ if (name == "DeviceGray" || name == "DeviceCMYK" || name == "DeviceRGB") { ByteString defname = "Default"; defname += name.Last(name.GetLength() - 7); - const CPDF_Object* pDefObj = FindResourceObj("ColorSpace", defname); + RetainPtr<const CPDF_Object> pDefObj = + FindResourceObj("ColorSpace", defname); if (!pDefObj) { if (name == "DeviceGray") { return CPDF_ColorSpace::GetStockCS( @@ -1171,32 +1174,33 @@ return CPDF_ColorSpace::GetStockCS(CPDF_ColorSpace::Family::kDeviceCMYK); } + // TODO(tsepez); pass retained argument. return CPDF_DocPageData::FromDocument(m_pDocument.Get()) - ->GetColorSpace(pDefObj, nullptr); + ->GetColorSpace(pDefObj.Get(), nullptr); } - const CPDF_Object* pCSObj = FindResourceObj("ColorSpace", name); + RetainPtr<const CPDF_Object> pCSObj = FindResourceObj("ColorSpace", name); if (!pCSObj) return nullptr; return CPDF_DocPageData::FromDocument(m_pDocument.Get()) - ->GetColorSpace(pCSObj, nullptr); + ->GetColorSpace(pCSObj.Get(), nullptr); } RetainPtr<CPDF_Pattern> CPDF_StreamContentParser::FindPattern( const ByteString& name) { - CPDF_Object* pPattern = FindResourceObj("Pattern", name); + RetainPtr<CPDF_Object> pPattern = FindResourceObj("Pattern", name); if (!pPattern || (!pPattern->IsDictionary() && !pPattern->IsStream())) return nullptr; return CPDF_DocPageData::FromDocument(m_pDocument.Get()) - ->GetPattern(pPattern, m_pCurStates->m_ParentMatrix); + ->GetPattern(std::move(pPattern), m_pCurStates->m_ParentMatrix); } RetainPtr<CPDF_ShadingPattern> CPDF_StreamContentParser::FindShading( const ByteString& name) { - CPDF_Object* pPattern = FindResourceObj("Shading", name); + RetainPtr<CPDF_Object> pPattern = FindResourceObj("Shading", name); if (!pPattern || (!pPattern->IsDictionary() && !pPattern->IsStream())) return nullptr; return CPDF_DocPageData::FromDocument(m_pDocument.Get()) - ->GetShading(pPattern, m_pCurStates->m_ParentMatrix); + ->GetShading(std::move(pPattern), m_pCurStates->m_ParentMatrix); } void CPDF_StreamContentParser::AddTextObject(const ByteString* pStrs,
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.h b/core/fpdfapi/page/cpdf_streamcontentparser.h index 09c3587..5409163 100644 --- a/core/fpdfapi/page/cpdf_streamcontentparser.h +++ b/core/fpdfapi/page/cpdf_streamcontentparser.h
@@ -133,8 +133,9 @@ RetainPtr<CPDF_ColorSpace> FindColorSpace(const ByteString& name); RetainPtr<CPDF_Pattern> FindPattern(const ByteString& name); RetainPtr<CPDF_ShadingPattern> FindShading(const ByteString& name); - CPDF_Dictionary* FindResourceHolder(const ByteString& type); - CPDF_Object* FindResourceObj(const ByteString& type, const ByteString& name); + RetainPtr<CPDF_Dictionary> FindResourceHolder(const ByteString& type); + RetainPtr<CPDF_Object> FindResourceObj(const ByteString& type, + const ByteString& name); // Takes ownership of |pImageObj|, returns unowned pointer to it. CPDF_ImageObject* AddImageObject(std::unique_ptr<CPDF_ImageObject> pImageObj);
diff --git a/core/fpdfapi/page/cpdf_tilingpattern.cpp b/core/fpdfapi/page/cpdf_tilingpattern.cpp index 1fd7fa8..5be1c0b 100644 --- a/core/fpdfapi/page/cpdf_tilingpattern.cpp +++ b/core/fpdfapi/page/cpdf_tilingpattern.cpp
@@ -8,6 +8,8 @@ #include <math.h> +#include <utility> + #include "core/fpdfapi/page/cpdf_allstates.h" #include "core/fpdfapi/page/cpdf_form.h" #include "core/fpdfapi/page/cpdf_pageobject.h" @@ -17,9 +19,9 @@ #include "third_party/base/check.h" CPDF_TilingPattern::CPDF_TilingPattern(CPDF_Document* pDoc, - CPDF_Object* pPatternObj, + RetainPtr<CPDF_Object> pPatternObj, const CFX_Matrix& parentMatrix) - : CPDF_Pattern(pDoc, pPatternObj, parentMatrix) { + : CPDF_Pattern(pDoc, std::move(pPatternObj), parentMatrix) { DCHECK(document()); m_bColored = pattern_obj()->GetDict()->GetIntegerFor("PaintType") == 1; SetPatternToFormMatrix();
diff --git a/core/fpdfapi/page/cpdf_tilingpattern.h b/core/fpdfapi/page/cpdf_tilingpattern.h index 94fd7c6..e36a563 100644 --- a/core/fpdfapi/page/cpdf_tilingpattern.h +++ b/core/fpdfapi/page/cpdf_tilingpattern.h
@@ -35,7 +35,7 @@ private: CPDF_TilingPattern(CPDF_Document* pDoc, - CPDF_Object* pPatternObj, + RetainPtr<CPDF_Object> pPatternObj, const CFX_Matrix& parentMatrix); CPDF_TilingPattern(const CPDF_TilingPattern&) = delete; CPDF_TilingPattern& operator=(const CPDF_TilingPattern&) = delete;
diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp index 4796b32..be8e867 100644 --- a/core/fpdfapi/parser/cpdf_document.cpp +++ b/core/fpdfapi/parser/cpdf_document.cpp
@@ -491,9 +491,9 @@ return true; } -CPDF_Dictionary* CPDF_Document::GetInfo() { +RetainPtr<CPDF_Dictionary> CPDF_Document::GetInfo() { if (m_pInfoDict) - return m_pInfoDict.Get(); + return m_pInfoDict; if (!m_pParser) return nullptr; @@ -504,10 +504,10 @@ auto ref = pdfium::MakeRetain<CPDF_Reference>(this, info_obj_num); m_pInfoDict = ToDictionary(ref->GetMutableDirect()); - return m_pInfoDict.Get(); + return m_pInfoDict; } -const CPDF_Array* CPDF_Document::GetFileIdentifier() const { +RetainPtr<const CPDF_Array> CPDF_Document::GetFileIdentifier() const { return m_pParser ? m_pParser->GetIDArray() : nullptr; }
diff --git a/core/fpdfapi/parser/cpdf_document.h b/core/fpdfapi/parser/cpdf_document.h index 04cdd3b..6ebc541 100644 --- a/core/fpdfapi/parser/cpdf_document.h +++ b/core/fpdfapi/parser/cpdf_document.h
@@ -92,8 +92,8 @@ CPDF_Parser* GetParser() const { return m_pParser.get(); } const CPDF_Dictionary* GetRoot() const { return m_pRootDict.Get(); } RetainPtr<CPDF_Dictionary> GetMutableRoot() { return m_pRootDict; } - CPDF_Dictionary* GetInfo(); - const CPDF_Array* GetFileIdentifier() const; + RetainPtr<CPDF_Dictionary> GetInfo(); + RetainPtr<const CPDF_Array> GetFileIdentifier() const; void DeletePage(int iPage); int GetPageCount() const;
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp index e7751e3..d734fcc 100644 --- a/core/fpdfapi/parser/cpdf_parser.cpp +++ b/core/fpdfapi/parser/cpdf_parser.cpp
@@ -851,9 +851,8 @@ m_CrossRefTable->AddCompressed(obj_num, archive_obj_num, archive_obj_index); } -// TODO(tsepez): return retained object. -const CPDF_Array* CPDF_Parser::GetIDArray() const { - return GetTrailer() ? GetTrailer()->GetArrayFor("ID").Get() : nullptr; +RetainPtr<const CPDF_Array> CPDF_Parser::GetIDArray() const { + return GetTrailer() ? GetTrailer()->GetArrayFor("ID") : nullptr; } // TODO(tsepez): return retained object, though not clear if it can change.
diff --git a/core/fpdfapi/parser/cpdf_parser.h b/core/fpdfapi/parser/cpdf_parser.h index a68346d..b39c749 100644 --- a/core/fpdfapi/parser/cpdf_parser.h +++ b/core/fpdfapi/parser/cpdf_parser.h
@@ -88,9 +88,8 @@ uint32_t GetPermissions() const; uint32_t GetRootObjNum() const; uint32_t GetInfoObjNum() const; - const CPDF_Array* GetIDArray() const; + RetainPtr<const CPDF_Array> GetIDArray() const; const CPDF_Dictionary* GetRoot() const; - const CPDF_Dictionary* GetEncryptDict() const; RetainPtr<CPDF_Object> ParseIndirectObject(uint32_t objnum);
diff --git a/core/fpdfapi/parser/cpdf_security_handler.cpp b/core/fpdfapi/parser/cpdf_security_handler.cpp index 6701687..db102bb 100644 --- a/core/fpdfapi/parser/cpdf_security_handler.cpp +++ b/core/fpdfapi/parser/cpdf_security_handler.cpp
@@ -189,7 +189,7 @@ CPDF_SecurityHandler::~CPDF_SecurityHandler() = default; bool CPDF_SecurityHandler::OnInit(const CPDF_Dictionary* pEncryptDict, - const CPDF_Array* pIdArray, + RetainPtr<const CPDF_Array> pIdArray, const ByteString& password) { if (pIdArray) m_FileId = pIdArray->GetByteStringAt(0);
diff --git a/core/fpdfapi/parser/cpdf_security_handler.h b/core/fpdfapi/parser/cpdf_security_handler.h index 9da342e..ace4854 100644 --- a/core/fpdfapi/parser/cpdf_security_handler.h +++ b/core/fpdfapi/parser/cpdf_security_handler.h
@@ -24,7 +24,7 @@ CONSTRUCT_VIA_MAKE_RETAIN; bool OnInit(const CPDF_Dictionary* pEncryptDict, - const CPDF_Array* pIdArray, + RetainPtr<const CPDF_Array> pIdArray, const ByteString& password); void OnCreate(CPDF_Dictionary* pEncryptDict, const CPDF_Array* pIdArray,
diff --git a/fpdfsdk/fpdf_doc.cpp b/fpdfsdk/fpdf_doc.cpp index c7c6499..c6c396e 100644 --- a/fpdfsdk/fpdf_doc.cpp +++ b/fpdfsdk/fpdf_doc.cpp
@@ -470,7 +470,7 @@ if (id_type != FILEIDTYPE_PERMANENT && id_type != FILEIDTYPE_CHANGING) return 0; - const CPDF_Array* pFileId = pDoc->GetFileIdentifier(); + RetainPtr<const CPDF_Array> pFileId = pDoc->GetFileIdentifier(); if (!pFileId) return 0; @@ -494,9 +494,10 @@ if (!pDoc) return 0; - const CPDF_Dictionary* pInfo = pDoc->GetInfo(); + RetainPtr<const CPDF_Dictionary> pInfo = pDoc->GetInfo(); if (!pInfo) return 0; + WideString text = pInfo->GetUnicodeTextFor(tag); return Utf16EncodeMaybeCopyAndReturnLength(text, buffer, buflen); }
diff --git a/fpdfsdk/fpdf_editpage.cpp b/fpdfsdk/fpdf_editpage.cpp index 8352117..c88ecfb 100644 --- a/fpdfsdk/fpdf_editpage.cpp +++ b/fpdfsdk/fpdf_editpage.cpp
@@ -172,7 +172,7 @@ } } - CPDF_Dictionary* pInfoDict = pDoc->GetInfo(); + RetainPtr<CPDF_Dictionary> pInfoDict = pDoc->GetInfo(); if (pInfoDict) { if (IsPDFSandboxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) pInfoDict->SetNewFor<CPDF_String>("CreationDate", DateStr, false);
diff --git a/fpdfsdk/fpdf_ppo.cpp b/fpdfsdk/fpdf_ppo.cpp index fa2ce50..4a50cf7 100644 --- a/fpdfsdk/fpdf_ppo.cpp +++ b/fpdfsdk/fpdf_ppo.cpp
@@ -255,7 +255,7 @@ if (!pNewRoot) return false; - CPDF_Dictionary* pDocInfoDict = dest()->GetInfo(); + RetainPtr<CPDF_Dictionary> pDocInfoDict = dest()->GetInfo(); if (!pDocInfoDict) return false;
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp index 7f2d1fa..7aab490 100644 --- a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp +++ b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
@@ -396,10 +396,14 @@ } WideString CPDFXFA_DocEnvironment::GetTitle(const CXFA_FFDoc* hDoc) const { - if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetPDFDoc()) + if (hDoc != m_pContext->GetXFADoc()) return WideString(); - const CPDF_Dictionary* pInfoDict = m_pContext->GetPDFDoc()->GetInfo(); + CPDF_Document* pPDFDoc = m_pContext->GetPDFDoc(); + if (!pPDFDoc) + return WideString(); + + RetainPtr<const CPDF_Dictionary> pInfoDict = pPDFDoc->GetInfo(); if (!pInfoDict) return WideString(); @@ -409,10 +413,14 @@ void CPDFXFA_DocEnvironment::SetTitle(CXFA_FFDoc* hDoc, const WideString& wsTitle) { - if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetPDFDoc()) + if (hDoc != m_pContext->GetXFADoc()) return; - CPDF_Dictionary* pInfoDict = m_pContext->GetPDFDoc()->GetInfo(); + CPDF_Document* pPDFDoc = m_pContext->GetPDFDoc(); + if (!pPDFDoc) + return; + + RetainPtr<CPDF_Dictionary> pInfoDict = pPDFDoc->GetInfo(); if (pInfoDict) pInfoDict->SetNewFor<CPDF_String>("Title", wsTitle.AsStringView()); }
diff --git a/fxjs/cjs_document.cpp b/fxjs/cjs_document.cpp index 3e19969..946fa95 100644 --- a/fxjs/cjs_document.cpp +++ b/fxjs/cjs_document.cpp
@@ -660,7 +660,8 @@ if (!m_pFormFillEnv) return CJS_Result::Failure(JSMessage::kBadObjectError); - const auto* pDictionary = m_pFormFillEnv->GetPDFDocument()->GetInfo(); + RetainPtr<const CPDF_Dictionary> pDictionary = + m_pFormFillEnv->GetPDFDocument()->GetInfo(); if (!pDictionary) return CJS_Result::Failure(JSMessage::kBadObjectError); @@ -726,9 +727,11 @@ if (!m_pFormFillEnv) return CJS_Result::Failure(JSMessage::kBadObjectError); - CPDF_Dictionary* pDictionary = m_pFormFillEnv->GetPDFDocument()->GetInfo(); + RetainPtr<CPDF_Dictionary> pDictionary = + m_pFormFillEnv->GetPDFDocument()->GetInfo(); if (!pDictionary) return CJS_Result::Failure(JSMessage::kBadObjectError); + return CJS_Result::Success(pRuntime->NewString( pDictionary->GetUnicodeTextFor(propName).AsStringView())); }