diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2022-01-03 14:15:49 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2022-02-27 22:25:44 +0100 |
commit | e1e62ba8bb09c532db576abcca451238bc86ffef (patch) | |
tree | 20c4719f7af347439759d1cd2ed47577ba3c2764 /sfx2 | |
parent | 321325452c16e5e0f9e5258bb2ccdbfff63acc12 (diff) |
lokit: double check for disposed windows & fix leak.
it seems we can get windows disposed before we get to the emission.
<segv>
vcl::Window::IsTracking() const vcl/source/window/window2.cxx:341
(anonymous namespace)::LOKPostAsyncEvent(void*, void*) sfx2/source/view/lokhelper.cxx:725
LokChartHelper::postMouseEvent(int, int, int, int, int, int, double, double) include/rtl/ref.hxx:112
SwXTextDocument::postMouseEvent(int, int, int, int, int, int) sw/source/uibase/uno/unotxdoc.cxx:3561
Change-Id: I93aea931dad1e7f43d3d610568424c53d2b22fbc
Signed-off-by: Michael Meeks <michael.meeks@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127907
(cherry picked from commit 7ba99b8d6da07c2133c644de4d1a3613a9fa5a68)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129839
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sfx2')
-rw-r--r-- | sfx2/source/view/lokhelper.cxx | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/sfx2/source/view/lokhelper.cxx b/sfx2/source/view/lokhelper.cxx index cd93f9b4dd55..cb8194c1cabf 100644 --- a/sfx2/source/view/lokhelper.cxx +++ b/sfx2/source/view/lokhelper.cxx @@ -679,9 +679,7 @@ namespace { std::unique_ptr<LOKAsyncEventData> pLOKEv(static_cast<LOKAsyncEventData*>(pEv)); if (pLOKEv->mpWindow->isDisposed()) - { return; - } int nView = SfxLokHelper::getView(nullptr); if (nView != pLOKEv->mnView) @@ -700,6 +698,9 @@ namespace if (!pFocusWindow) pFocusWindow = pLOKEv->mpWindow; + if (pLOKEv->mpWindow->isDisposed()) + return; + switch (pLOKEv->mnEvent) { case VclEventId::WindowKeyInput: @@ -708,11 +709,13 @@ namespace KeyEvent singlePress(pLOKEv->maKeyEvent.GetCharCode(), pLOKEv->maKeyEvent.GetKeyCode()); for (sal_uInt16 i = 0; i <= nRepeat; ++i) - pFocusWindow->KeyInput(singlePress); + if (!pFocusWindow->isDisposed()) + pFocusWindow->KeyInput(singlePress); break; } case VclEventId::WindowKeyUp: - pFocusWindow->KeyUp(pLOKEv->maKeyEvent); + if (!pFocusWindow->isDisposed()) + pFocusWindow->KeyUp(pLOKEv->maKeyEvent); break; case VclEventId::WindowMouseButtonDown: pLOKEv->mpWindow->LogicMouseButtonDown(pLOKEv->maMouseEvent); |