Observe PageViews across CPDFSDK_FormFillEnvironment::m_PageMap iter
These could theoretically pop out of existence, causing the iterator
to go stale. Since the map owns the pageview, we can use the pageview
as a proxy for iterator validity.
Bug: chromium:962815
Change-Id: I84e68b767124a762917ef28e37f94c290be92077
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/94631
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/cpdfsdk_formfillenvironment.cpp b/fpdfsdk/cpdfsdk_formfillenvironment.cpp
index b73f971..3492b99 100644
--- a/fpdfsdk/cpdfsdk_formfillenvironment.cpp
+++ b/fpdfsdk/cpdfsdk_formfillenvironment.cpp
@@ -598,8 +598,12 @@
void CPDFSDK_FormFillEnvironment::ClearAllFocusedAnnots() {
for (auto& it : m_PageMap) {
- if (it.second->IsValidSDKAnnot(GetFocusAnnot()))
+ if (it.second->IsValidSDKAnnot(GetFocusAnnot())) {
+ ObservedPtr<CPDFSDK_PageView> pObserved(it.second.get());
KillFocusAnnot({});
+ if (!pObserved)
+ break;
+ }
}
}
@@ -709,9 +713,12 @@
void CPDFSDK_FormFillEnvironment::UpdateAllViews(CPDFSDK_Annot* pAnnot) {
for (const auto& it : m_PageMap) {
- CPDFSDK_PageView* pPageView = it.second.get();
- if (pPageView)
- pPageView->UpdateView(pAnnot);
+ ObservedPtr<CPDFSDK_PageView> pObserved(it.second.get());
+ if (pObserved) {
+ pObserved->UpdateView(pAnnot);
+ if (!pObserved)
+ break;
+ }
}
}