[Libreoffice-commits] core.git: Branch 'libreoffice-5-3' - sw/source

Michael Stahl mstahl at redhat.com
Tue May 2 12:56:49 UTC 2017


 sw/source/uibase/wrtsh/wrtsh1.cxx |    5 +++++
 1 file changed, 5 insertions(+)

New commits:
commit e07c2c3861f47946ed72fc9b67aafeaa8598468d
Author: Michael Stahl <mstahl at redhat.com>
Date:   Fri Apr 28 13:26:01 2017 +0200

    tdf#107474 sw: fix crash when deleting header with active SdrObject
    
    The problem is that the SdrView's text edit mode remains active when
    the header is deleted, which deletes the active SdrObject that is
    anchored in the header.
    
    Then the next call to SdrBeginTextEdit() will call SdrEndTextEdit()
    but the mxTextEditObj WeakReference is null then and so the cleanup
    code that resets the SdrOutliner's UndoManager is not called,
    but then the SdrOutliner is deleted.
    
    What's really horrible about this is that while text editing is active,
    both SdrObjEditView and ImpEditEngine consider themselves the
    exclusive owner of SwDoc's UndoManager.
    
    (regression from 12a4200e8ff7f045efcc7e9d15a24b15b248c437
     and d7b7c9fdfe63deec26c420efc3ff1fd73c21bb27)
    
    Change-Id: I17c5165a03d2de1eaba8a335dfbfded56573f8a2
    (cherry picked from commit 7f207fca577ef820be2aec0a442df7e8ab6e14a6)
    Reviewed-on: https://gerrit.libreoffice.org/37069
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/sw/source/uibase/wrtsh/wrtsh1.cxx b/sw/source/uibase/wrtsh/wrtsh1.cxx
index 7695865d8e16..1f8ae7ba9023 100644
--- a/sw/source/uibase/wrtsh/wrtsh1.cxx
+++ b/sw/source/uibase/wrtsh/wrtsh1.cxx
@@ -1765,6 +1765,11 @@ void SwWrtShell::SetReadonlyOption(bool bSet)
 void SwWrtShell::ChangeHeaderOrFooter(
     const OUString& rStyleName, bool bHeader, bool bOn, bool bShowWarning)
 {
+    SdrView *const pSdrView = GetDrawView();
+    if (pSdrView && pSdrView->IsTextEdit())
+    {   // tdf#107474 deleting header may delete active drawing object
+        pSdrView->SdrEndTextEdit(true);
+    }
     addCurrentPosition();
     StartAllAction();
     StartUndo( UNDO_HEADER_FOOTER ); // #i7983#


More information about the Libreoffice-commits mailing list