Observe CPDFSDK_PageView inside ExitWidget(). ExitWidget() can trigger the deletion of caller. Use an ObserverPtr to check for this and bail out safely. Bug: chromium:1026991 Change-Id: If27c1b02a0d6f3bb39c999a85366e393fa150687 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/66815 Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/fpdfsdk/cpdfsdk_pageview.cpp b/fpdfsdk/cpdfsdk_pageview.cpp index 732bd49..b32fbea 100644 --- a/fpdfsdk/cpdfsdk_pageview.cpp +++ b/fpdfsdk/cpdfsdk_pageview.cpp
@@ -403,12 +403,19 @@ bool callExitCallback, uint32_t nFlag) { m_bOnWidget = false; - if (m_pCaptureWidget) { - if (callExitCallback) - pAnnotHandlerMgr->Annot_OnMouseExit(this, &m_pCaptureWidget, nFlag); + if (!m_pCaptureWidget) + return; - m_pCaptureWidget.Reset(); + if (callExitCallback) { + ObservedPtr<CPDFSDK_PageView> pThis(this); + pAnnotHandlerMgr->Annot_OnMouseExit(this, &m_pCaptureWidget, nFlag); + + // Annot_OnMouseExit() may have invalidated |this|. + if (!pThis) + return; } + + m_pCaptureWidget.Reset(); } bool CPDFSDK_PageView::OnMouseWheel(double deltaX,
diff --git a/testing/resources/javascript/xfa_specific/bug_1026991.evt b/testing/resources/javascript/xfa_specific/bug_1026991.evt new file mode 100644 index 0000000..37d9022 --- /dev/null +++ b/testing/resources/javascript/xfa_specific/bug_1026991.evt
@@ -0,0 +1,5 @@ +mousemove,0,0 +mousedown,left,0,0 +mouseup,left,0,0 +charcode,80 +mousemove,0,200 \ No newline at end of file
diff --git a/testing/resources/javascript/xfa_specific/bug_1026991.in b/testing/resources/javascript/xfa_specific/bug_1026991.in new file mode 100644 index 0000000..4fb7657 --- /dev/null +++ b/testing/resources/javascript/xfa_specific/bug_1026991.in
@@ -0,0 +1,65 @@ +{{header}} +{{object 1 0}} << + /Type /Catalog + /Pages 2 0 R + /AcroForm << + /XFA 4 0 R + >> +>> +endobj +{{object 2 0}} << + /Type /Pages + /Count 1 + /Kids [3 0 R] +>> +endobj +{{object 3 0}} << + /Type /Page + /Parent 2 0 R + /MediaBox [0 0 612 792] +>> +endobj +{{object 4 0}} << + {{streamlen}} +>> +stream +<xdp xmlns="http://ns.adobe.com/xdp/"> + <config> + <acrobat> + <acrobat7> + <dynamicRender>required</dynamicRender> + </acrobat7> + </acrobat> + <present> + <pdf> + <interactive>1</interactive> + </pdf> + </present> + </config> + <template> + <subform> + <bookend leader="$"/> + <keep intact="none" previous="contentArea"/> + <field name="N01" minH="32in"> + <ui> + <choiceList> + <margin rightInset="8in"/> + </choiceList> + </ui> + </field> + <field minH="32in"> + <event activity="change"> + <script> + $host.setFocus("N01") + </script> + </event> + </field> + </subform> + </template> +</xdp> +endstream +endobj +{{xref}} +{{trailer}} +{{startxref}} +%%EOF