Avoid using raw pointers as keys in maps.
Convert to an equivalent smart pointer type as possible.
Change-Id: I4e7621fe7238192c36613ccb372f6b1062a84f49
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/98453
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_occontext.cpp b/core/fpdfapi/page/cpdf_occontext.cpp
index cc652df..b8edb07 100644
--- a/core/fpdfapi/page/cpdf_occontext.cpp
+++ b/core/fpdfapi/page/cpdf_occontext.cpp
@@ -167,7 +167,7 @@
return it->second;
bool bState = LoadOCGState(pOCGDict);
- m_OGCStateCache[pOCGDict] = bState;
+ m_OGCStateCache[pdfium::WrapRetain(pOCGDict)] = bState;
return bState;
}
diff --git a/core/fpdfapi/page/cpdf_occontext.h b/core/fpdfapi/page/cpdf_occontext.h
index c8a5dad..9c70068 100644
--- a/core/fpdfapi/page/cpdf_occontext.h
+++ b/core/fpdfapi/page/cpdf_occontext.h
@@ -7,6 +7,7 @@
#ifndef CORE_FPDFAPI_PAGE_CPDF_OCCONTEXT_H_
#define CORE_FPDFAPI_PAGE_CPDF_OCCONTEXT_H_
+#include <functional>
#include <map>
#include "core/fxcrt/bytestring.h"
@@ -40,7 +41,8 @@
UnownedPtr<CPDF_Document> const m_pDocument;
const UsageType m_eUsageType;
- mutable std::map<const CPDF_Dictionary*, bool> m_OGCStateCache;
+ mutable std::map<RetainPtr<const CPDF_Dictionary>, bool, std::less<>>
+ m_OGCStateCache;
};
#endif // CORE_FPDFAPI_PAGE_CPDF_OCCONTEXT_H_
diff --git a/core/fpdfapi/parser/cpdf_data_avail.h b/core/fpdfapi/parser/cpdf_data_avail.h
index 87ab321..5cbd279 100644
--- a/core/fpdfapi/parser/cpdf_data_avail.h
+++ b/core/fpdfapi/parser/cpdf_data_avail.h
@@ -7,6 +7,7 @@
#ifndef CORE_FPDFAPI_PARSER_CPDF_DATA_AVAIL_H_
#define CORE_FPDFAPI_PARSER_CPDF_DATA_AVAIL_H_
+#include <functional>
#include <map>
#include <memory>
#include <set>
@@ -183,14 +184,16 @@
std::vector<RetainPtr<CPDF_Object>> m_PagesArray;
bool m_bTotalLoadPageTree = false;
bool m_bCurPageDictLoadOK = false;
+ bool m_bHeaderAvail = false;
PageNode m_PageNode;
std::set<uint32_t> m_pageMapCheckState;
std::set<uint32_t> m_pagesLoadState;
std::unique_ptr<CPDF_HintTables> m_pHintTables;
std::map<uint32_t, std::unique_ptr<CPDF_PageObjectAvail>> m_PagesObjAvail;
- std::map<const CPDF_Object*, std::unique_ptr<CPDF_PageObjectAvail>>
+ std::map<RetainPtr<const CPDF_Object>,
+ std::unique_ptr<CPDF_PageObjectAvail>,
+ std::less<>>
m_PagesResourcesAvail;
- bool m_bHeaderAvail = false;
};
#endif // CORE_FPDFAPI_PARSER_CPDF_DATA_AVAIL_H_
diff --git a/core/fpdfapi/render/cpdf_docrenderdata.cpp b/core/fpdfapi/render/cpdf_docrenderdata.cpp
index a2e0654..701dede 100644
--- a/core/fpdfapi/render/cpdf_docrenderdata.cpp
+++ b/core/fpdfapi/render/cpdf_docrenderdata.cpp
@@ -63,7 +63,7 @@
return pdfium::WrapRetain(it->second.Get());
auto pFunc = CreateTransferFunc(pObj);
- m_TransferFuncMap[pObj].Reset(pFunc.Get());
+ m_TransferFuncMap[pdfium::WrapRetain(pObj)].Reset(pFunc.Get());
return pFunc;
}
diff --git a/core/fpdfapi/render/cpdf_docrenderdata.h b/core/fpdfapi/render/cpdf_docrenderdata.h
index 6a500c6..c280fe7 100644
--- a/core/fpdfapi/render/cpdf_docrenderdata.h
+++ b/core/fpdfapi/render/cpdf_docrenderdata.h
@@ -7,6 +7,7 @@
#ifndef CORE_FPDFAPI_RENDER_CPDF_DOCRENDERDATA_H_
#define CORE_FPDFAPI_RENDER_CPDF_DOCRENDERDATA_H_
+#include <functional>
#include <map>
#include "build/build_config.h"
@@ -51,8 +52,11 @@
const CPDF_Object* pObj) const;
private:
+ // TODO(tsepez): investigate this map outliving its font keys.
std::map<CPDF_Font*, ObservedPtr<CPDF_Type3Cache>> m_Type3FaceMap;
- std::map<const CPDF_Object*, ObservedPtr<CPDF_TransferFunc>>
+ std::map<RetainPtr<const CPDF_Object>,
+ ObservedPtr<CPDF_TransferFunc>,
+ std::less<>>
m_TransferFuncMap;
#if BUILDFLAG(IS_WIN)
diff --git a/core/fpdfapi/render/cpdf_pagerendercache.cpp b/core/fpdfapi/render/cpdf_pagerendercache.cpp
index 4a49778..d7497de 100644
--- a/core/fpdfapi/render/cpdf_pagerendercache.cpp
+++ b/core/fpdfapi/render/cpdf_pagerendercache.cpp
@@ -56,7 +56,7 @@
uint32_t nTimeCount = m_nTimeCount;
if (nTimeCount + 1 < nTimeCount) {
for (uint32_t i = 0; i < nCount; i++)
- m_ImageCache[cache_info[i].pStream]->SetTimeCount(i);
+ m_ImageCache[pdfium::WrapRetain(cache_info[i].pStream)]->SetTimeCount(i);
m_nTimeCount = nCount;
}
@@ -97,7 +97,7 @@
m_nTimeCount++;
if (!m_bCurFindCache)
- m_ImageCache[pStream] = m_pCurImageCacheEntry.Release();
+ m_ImageCache[pdfium::WrapRetain(pStream)] = m_pCurImageCacheEntry.Release();
if (ret == CPDF_DIB::LoadState::kFail)
m_nCacheSize += m_pCurImageCacheEntry->EstimateSize();
@@ -113,7 +113,9 @@
m_nTimeCount++;
if (!m_bCurFindCache) {
- m_ImageCache[m_pCurImageCacheEntry->GetImage()->GetStream()] =
+ // TODO(tsepez): GetStream() should return retained reference.
+ m_ImageCache[pdfium::WrapRetain(
+ m_pCurImageCacheEntry->GetImage()->GetStream())] =
m_pCurImageCacheEntry.Release();
}
m_nCacheSize += m_pCurImageCacheEntry->EstimateSize();
diff --git a/core/fpdfapi/render/cpdf_pagerendercache.h b/core/fpdfapi/render/cpdf_pagerendercache.h
index e98dba1..d9eddf0 100644
--- a/core/fpdfapi/render/cpdf_pagerendercache.h
+++ b/core/fpdfapi/render/cpdf_pagerendercache.h
@@ -9,6 +9,7 @@
#include <stdint.h>
+#include <functional>
#include <map>
#include <memory>
@@ -91,7 +92,10 @@
void ClearImageCacheEntry(const CPDF_Stream* pStream);
UnownedPtr<CPDF_Page> const m_pPage;
- std::map<const CPDF_Stream*, std::unique_ptr<ImageCacheEntry>> m_ImageCache;
+ std::map<RetainPtr<const CPDF_Stream>,
+ std::unique_ptr<ImageCacheEntry>,
+ std::less<>>
+ m_ImageCache;
MaybeOwned<ImageCacheEntry> m_pCurImageCacheEntry;
uint32_t m_nTimeCount = 0;
uint32_t m_nCacheSize = 0;
diff --git a/core/fpdfdoc/cpdf_interactiveform.cpp b/core/fpdfdoc/cpdf_interactiveform.cpp
index a29be97..7721a5d 100644
--- a/core/fpdfdoc/cpdf_interactiveform.cpp
+++ b/core/fpdfdoc/cpdf_interactiveform.cpp
@@ -752,7 +752,7 @@
const std::vector<UnownedPtr<CPDF_FormControl>>&
CPDF_InteractiveForm::GetControlsForField(const CPDF_FormField* pField) {
- return m_ControlLists[pField];
+ return m_ControlLists[pdfium::WrapUnowned(pField)];
}
void CPDF_InteractiveForm::LoadField(RetainPtr<CPDF_Dictionary> pFieldDict,
@@ -880,8 +880,8 @@
auto pNew = std::make_unique<CPDF_FormControl>(pField, pWidgetDict);
CPDF_FormControl* pControl = pNew.get();
- m_ControlMap[pWidgetDict.Get()] = std::move(pNew);
- m_ControlLists[pField].emplace_back(pControl);
+ m_ControlMap[pWidgetDict] = std::move(pNew);
+ m_ControlLists[pdfium::WrapUnowned(pField)].emplace_back(pControl);
return pControl;
}
diff --git a/core/fpdfdoc/cpdf_interactiveform.h b/core/fpdfdoc/cpdf_interactiveform.h
index e10deca..ee39243 100644
--- a/core/fpdfdoc/cpdf_interactiveform.h
+++ b/core/fpdfdoc/cpdf_interactiveform.h
@@ -10,6 +10,7 @@
#include <stddef.h>
#include <stdint.h>
+#include <functional>
#include <map>
#include <memory>
#include <vector>
@@ -109,10 +110,14 @@
UnownedPtr<CPDF_Document> const m_pDocument;
RetainPtr<CPDF_Dictionary> m_pFormDict;
std::unique_ptr<CFieldTree> m_pFieldTree;
- std::map<const CPDF_Dictionary*, std::unique_ptr<CPDF_FormControl>>
+ std::map<RetainPtr<const CPDF_Dictionary>,
+ std::unique_ptr<CPDF_FormControl>,
+ std::less<>>
m_ControlMap;
// Points into |m_ControlMap|.
- std::map<const CPDF_FormField*, std::vector<UnownedPtr<CPDF_FormControl>>>
+ std::map<UnownedPtr<const CPDF_FormField>,
+ std::vector<UnownedPtr<CPDF_FormControl>>,
+ std::less<>>
m_ControlLists;
UnownedPtr<NotifierIface> m_pFormNotify;
};
diff --git a/core/fpdfdoc/cpdf_structtree.cpp b/core/fpdfdoc/cpdf_structtree.cpp
index 1294ba5..7a67ea1 100644
--- a/core/fpdfdoc/cpdf_structtree.cpp
+++ b/core/fpdfdoc/cpdf_structtree.cpp
@@ -99,12 +99,13 @@
if (it != map->end())
return it->second;
+ RetainPtr<const CPDF_Dictionary> key(pDict);
auto pElement = pdfium::MakeRetain<CPDF_StructElement>(this, pDict);
- (*map)[pDict] = pElement;
+ (*map)[key] = pElement;
RetainPtr<const CPDF_Dictionary> pParent = pDict->GetDictFor("P");
if (!pParent || pParent->GetNameFor("Type") == "StructTreeRoot") {
- if (!AddTopLevelNode(pDict.Get(), pElement))
- map->erase(pDict);
+ if (!AddTopLevelNode(pDict, pElement))
+ map->erase(key);
return pElement;
}
@@ -113,8 +114,8 @@
if (!pParentElement)
return pElement;
- if (!pParentElement->UpdateKidIfElement(pDict.Get(), pElement.Get()))
- map->erase(pDict);
+ if (!pParentElement->UpdateKidIfElement(pDict, pElement.Get()))
+ map->erase(key);
pElement->SetParent(pParentElement.Get());
diff --git a/fpdfsdk/cpdfsdk_interactiveform.cpp b/fpdfsdk/cpdfsdk_interactiveform.cpp
index 0568c9f..c4f6477 100644
--- a/fpdfsdk/cpdfsdk_interactiveform.cpp
+++ b/fpdfsdk/cpdfsdk_interactiveform.cpp
@@ -198,11 +198,13 @@
void CPDFSDK_InteractiveForm::AddMap(CPDF_FormControl* pControl,
CPDFSDK_Widget* pWidget) {
- m_Map[pControl] = pWidget;
+ m_Map[pdfium::WrapUnowned(pControl)] = pWidget;
}
void CPDFSDK_InteractiveForm::RemoveMap(CPDF_FormControl* pControl) {
- m_Map.erase(pControl);
+ auto it = m_Map.find(pControl);
+ if (it != m_Map.end())
+ m_Map.erase(it);
}
void CPDFSDK_InteractiveForm::EnableCalculate(bool bEnabled) {
diff --git a/fpdfsdk/cpdfsdk_interactiveform.h b/fpdfsdk/cpdfsdk_interactiveform.h
index 2510d42..4de69b6 100644
--- a/fpdfsdk/cpdfsdk_interactiveform.h
+++ b/fpdfsdk/cpdfsdk_interactiveform.h
@@ -7,6 +7,7 @@
#ifndef FPDFSDK_CPDFSDK_INTERACTIVEFORM_H_
#define FPDFSDK_CPDFSDK_INTERACTIVEFORM_H_
+#include <functional>
#include <map>
#include <memory>
#include <vector>
@@ -103,7 +104,10 @@
UnownedPtr<CPDFSDK_FormFillEnvironment> const m_pFormFillEnv;
std::unique_ptr<CPDF_InteractiveForm> const m_pInteractiveForm;
- std::map<CPDF_FormControl*, UnownedPtr<CPDFSDK_Widget>> m_Map;
+ std::map<UnownedPtr<const CPDF_FormControl>,
+ UnownedPtr<CPDFSDK_Widget>,
+ std::less<>>
+ m_Map;
#ifdef PDF_ENABLE_XFA
bool m_bXfaCalculate = true;
bool m_bXfaValidationsEnabled = true;