Store retained streams in CPDF_DocPageData::m_FontFileMap.
Then pass retained arguments where possible. Avoids the (unlikely)
possibility that a delete/new pair gives a different object at
the same address which does not correspond to the mapping.
Change-Id: I2637228227672ca756b61b91933cb8b90ecfddf9
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/98192
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/font/cpdf_font.cpp b/core/fpdfapi/font/cpdf_font.cpp
index 1e32c34..ad348b2 100644
--- a/core/fpdfapi/font/cpdf_font.cpp
+++ b/core/fpdfapi/font/cpdf_font.cpp
@@ -57,10 +57,8 @@
CPDF_Font::~CPDF_Font() {
if (m_pFontFile) {
auto* pPageData = m_pDocument->GetPageData();
- if (pPageData) {
- pPageData->MaybePurgeFontFileStreamAcc(
- m_pFontFile->GetStream()->AsStream());
- }
+ if (pPageData)
+ pPageData->MaybePurgeFontFileStreamAcc(m_pFontFile->GetStream());
}
}
@@ -217,7 +215,7 @@
return;
if (!m_Font.LoadEmbedded(m_pFontFile->GetSpan(), IsVertWriting(), key)) {
- pData->MaybePurgeFontFileStreamAcc(m_pFontFile->GetStream()->AsStream());
+ pData->MaybePurgeFontFileStreamAcc(m_pFontFile->GetStream());
m_pFontFile = nullptr;
}
}
diff --git a/core/fpdfapi/page/cpdf_docpagedata.cpp b/core/fpdfapi/page/cpdf_docpagedata.cpp
index bd17bb6..ac90396 100644
--- a/core/fpdfapi/page/cpdf_docpagedata.cpp
+++ b/core/fpdfapi/page/cpdf_docpagedata.cpp
@@ -422,7 +422,7 @@
RetainPtr<CPDF_StreamAcc> CPDF_DocPageData::GetFontFileStreamAcc(
RetainPtr<const CPDF_Stream> pFontStream) {
DCHECK(pFontStream);
- auto it = m_FontFileMap.find(pFontStream.Get());
+ auto it = m_FontFileMap.find(pFontStream);
if (it != m_FontFileMap.end())
return it->second;
@@ -440,16 +440,16 @@
auto pFontAcc = pdfium::MakeRetain<CPDF_StreamAcc>(pFontStream);
pFontAcc->LoadAllDataFilteredWithEstimatedSize(org_size);
- m_FontFileMap[pFontStream.Get()] = pFontAcc;
+ m_FontFileMap[std::move(pFontStream)] = pFontAcc;
return pFontAcc;
}
void CPDF_DocPageData::MaybePurgeFontFileStreamAcc(
- const CPDF_Stream* pFontStream) {
+ RetainPtr<const CPDF_Stream> pFontStream) {
if (!pFontStream)
return;
- auto it = m_FontFileMap.find(pFontStream);
+ auto it = m_FontFileMap.find(std::move(pFontStream));
if (it != m_FontFileMap.end() && it->second->HasOneRef())
m_FontFileMap.erase(it);
}
diff --git a/core/fpdfapi/page/cpdf_docpagedata.h b/core/fpdfapi/page/cpdf_docpagedata.h
index c22725b..d6fbb52 100644
--- a/core/fpdfapi/page/cpdf_docpagedata.h
+++ b/core/fpdfapi/page/cpdf_docpagedata.h
@@ -42,7 +42,8 @@
void ClearStockFont() override;
RetainPtr<CPDF_StreamAcc> GetFontFileStreamAcc(
RetainPtr<const CPDF_Stream> pFontStream) override;
- void MaybePurgeFontFileStreamAcc(const CPDF_Stream* pFontStream) override;
+ void MaybePurgeFontFileStreamAcc(
+ RetainPtr<const CPDF_Stream> pFontStream) override;
// CPDF_Font::FormFactoryIFace:
std::unique_ptr<CPDF_Font::FormIface> CreateForm(
@@ -109,7 +110,8 @@
// 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<const CPDF_Stream*, RetainPtr<CPDF_StreamAcc>> m_FontFileMap;
+ 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<uint32_t, RetainPtr<CPDF_Image>> m_ImageMap;
diff --git a/core/fpdfapi/parser/cpdf_document.h b/core/fpdfapi/parser/cpdf_document.h
index c189316..04cdd3b 100644
--- a/core/fpdfapi/parser/cpdf_document.h
+++ b/core/fpdfapi/parser/cpdf_document.h
@@ -55,7 +55,7 @@
virtual RetainPtr<CPDF_StreamAcc> GetFontFileStreamAcc(
RetainPtr<const CPDF_Stream> pFontStream) = 0;
virtual void MaybePurgeFontFileStreamAcc(
- const CPDF_Stream* pFontStream) = 0;
+ RetainPtr<const CPDF_Stream> pFontStream) = 0;
void SetDocument(CPDF_Document* pDoc) { m_pDoc = pDoc; }
CPDF_Document* GetDocument() const { return m_pDoc.Get(); }
diff --git a/core/fpdfapi/parser/cpdf_stream_acc.cpp b/core/fpdfapi/parser/cpdf_stream_acc.cpp
index 6d5c7ef..f0eeb83 100644
--- a/core/fpdfapi/parser/cpdf_stream_acc.cpp
+++ b/core/fpdfapi/parser/cpdf_stream_acc.cpp
@@ -67,6 +67,10 @@
LoadAllData(true, 0, false);
}
+RetainPtr<const CPDF_Stream> CPDF_StreamAcc::GetStream() const {
+ return m_pStream;
+}
+
const CPDF_Dictionary* CPDF_StreamAcc::GetDict() const {
// TODO(tsepez): return retained references.
return m_pStream ? m_pStream->GetDict().Get() : nullptr;
diff --git a/core/fpdfapi/parser/cpdf_stream_acc.h b/core/fpdfapi/parser/cpdf_stream_acc.h
index 5db2923..2c6bfa1 100644
--- a/core/fpdfapi/parser/cpdf_stream_acc.h
+++ b/core/fpdfapi/parser/cpdf_stream_acc.h
@@ -32,7 +32,7 @@
void LoadAllDataImageAcc(uint32_t estimated_size);
void LoadAllDataRaw();
- const CPDF_Stream* GetStream() const { return m_pStream.Get(); }
+ RetainPtr<const CPDF_Stream> GetStream() const;
const CPDF_Dictionary* GetDict() const;
uint32_t GetSize() const;