diff options
author | Jaume Pujantell <jaume.pujantell@collabora.com> | 2024-07-29 12:35:50 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2024-08-01 13:54:28 +0200 |
commit | 75aeaab5ef36f819cdc11e88244f59efc4fbc5a6 (patch) | |
tree | fae4664a42236180da46b5c3658bf42c50910c54 /svx | |
parent | 39fd178b86608ebb0717bf15992bdf6b16d6e92a (diff) |
cool#9352 unassign cursor on SdrObjEditView to avoid crash
On stress test with shapes and typing a segfault ocurred due to
using a freed vcl::Cursor.
On SdrObjEditView::SdrEndTextEdit, delete pOLV can delete the cursor
remembered in pTECursorBuffer. But if it is set to the window before
the deletion, it will be safely removed from the window.
And on SdrObjEditView::ModelHasChanged a re-anchoring sets a cursor
on the window that sholdn't be there and other SdrObjEditView can
see, remeber, and use it even after this one died and freed the
cursor.
Change-Id: I3cfef3b68b77e6e6b49c3b68297a6a20e1f9394a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171184
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
(cherry picked from commit 3b5738ab1a646d089fa7cc59ffaeda7d011c1e07)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171288
Tested-by: Jenkins
Diffstat (limited to 'svx')
-rw-r--r-- | svx/source/svdraw/svdedxv.cxx | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/svx/source/svdraw/svdedxv.cxx b/svx/source/svdraw/svdedxv.cxx index fe647da817a1..ec938c51c320 100644 --- a/svx/source/svdraw/svdedxv.cxx +++ b/svx/source/svdraw/svdedxv.cxx @@ -434,8 +434,8 @@ void SdrObjEditView::ModelHasChanged() for (size_t nOV = 0; nOV < nOutlViewCnt; nOV++) { OutlinerView* pOLV = mpTextEditOutliner->GetView(nOV); + vcl::Window* pWin = pOLV->GetWindow(); { // invalidate old OutlinerView area - vcl::Window* pWin = pOLV->GetWindow(); tools::Rectangle aTmpRect(aOldArea); sal_uInt16 nPixSiz = pOLV->GetInvalidateMore() + 1; Size aMore(pWin->PixelToLogic(Size(nPixSiz, nPixSiz))); @@ -450,9 +450,15 @@ void SdrObjEditView::ModelHasChanged() if (bColorChg) pOLV->SetBackgroundColor(aNewColor); + bool bWasCoursorVisible = pOLV->IsCursorVisible(); + vcl::Cursor* pOldCursor = pWin->GetCursor(); pOLV->SetOutputArea( aTextEditArea); // because otherwise, we're not re-anchoring correctly ImpInvalidateOutlinerView(*pOLV); + // Undo SetOutputArea setting and showing the cursor + if (!bWasCoursorVisible) + pOLV->HideCursor(); + pWin->SetCursor(pOldCursor); } mpTextEditOutlinerView->ShowCursor(); } @@ -1853,6 +1859,10 @@ SdrEndTextEditKind SdrObjEditView::SdrEndTextEdit(bool bDontDeleteReally) // to call AdjustMarkHdl() always. AdjustMarkHdl(); } + if (pTEWin != nullptr) + { + pTEWin->SetCursor(pTECursorBuffer); + } // delete all OutlinerViews for (size_t i = pTEOutliner->GetViewCount(); i > 0;) { @@ -1884,10 +1894,6 @@ SdrEndTextEditKind SdrObjEditView::SdrEndTextEdit(bool bDontDeleteReally) delete pTEOutliner; else pTEOutliner->Clear(); - if (pTEWin != nullptr) - { - pTEWin->SetCursor(pTECursorBuffer); - } maHdlList.SetMoveOutside(false); if (eRet != SdrEndTextEditKind::Unchanged) { |