sd/source/ui/view/sdview3.cxx |    3 ++-
 svx/source/svdraw/svdundo.cxx |    6 ++++++
 2 files changed, 8 insertions(+), 1 deletion(-)

New commits:
commit c7ac5cb5a1fe531ac5af6c127419231e1d5b1e30
Author:     Balazs Varga <[email protected]>
AuthorDate: Mon Dec 22 14:59:46 2025 +0100
Commit:     Balazs Varga <[email protected]>
CommitDate: Sat Dec 27 17:14:28 2025 +0100

    tdf#170027 - sd fix crash when undoing shape drag with Alt pressed
    
    Do not overwrite original shape during drag&drop with Alt,
    when we try to drag&drop the shape on the same shape,
    but create a new shape with new name, same as if we would drag&drop
    the object in general.
    
    Change-Id: I08b2197b3b9755455a165a566eb3452846c0f78e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196097
    Reviewed-by: Mike Kaganski <[email protected]>
    Reviewed-by: Balazs Varga <[email protected]>
    Tested-by: Jenkins
    (cherry picked from commit 9f980e021ff1a7613003e5c93ec49a37c5ca3420)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196172
    Tested-by: Jenkins CollaboraOffice <[email protected]>

diff --git a/sd/source/ui/view/sdview3.cxx b/sd/source/ui/view/sdview3.cxx
index 29ce29193dfe..763e9b338175 100644
--- a/sd/source/ui/view/sdview3.cxx
+++ b/sd/source/ui/view/sdview3.cxx
@@ -746,7 +746,7 @@ bool View::InsertData( const TransferableDataHelper& 
rDataHelper,
                         SdrPageView*    pPV = nullptr;
                         SdrObject* pPickObj2 = PickObj(rPos, getHitTolLog(), 
pPV);
 
-                        if( ( mnAction & DND_ACTION_MOVE ) && pPickObj2 && 
pObj )
+                        if( ( mnAction & DND_ACTION_MOVE ) && pPickObj2 && 
pObj && pPickObj2->GetName() != pObj->GetName() )
                         {
                             // replace object
                             SdrPage* pWorkPage = GetSdrPageView()->GetPage();
@@ -786,6 +786,7 @@ bool View::InsertData( const TransferableDataHelper& 
rDataHelper,
                             mnAction = DND_ACTION_COPY;
                         }
                         else if( ( mnAction & DND_ACTION_LINK ) && pPickObj2 
&& pObj &&
+                            pPickObj2->GetName() != pObj->GetName() &&
                             dynamic_cast< const SdrGrafObj *>( pPickObj2 ) ==  
nullptr &&
                                 dynamic_cast< const SdrOle2Obj *>( pPickObj2 ) 
==  nullptr )
                         {
diff --git a/svx/source/svdraw/svdundo.cxx b/svx/source/svdraw/svdundo.cxx
index cac255f88603..2b3701620827 100644
--- a/svx/source/svdraw/svdundo.cxx
+++ b/svx/source/svdraw/svdundo.cxx
@@ -703,6 +703,7 @@ void SdrUndoRemoveObj::Undo()
     // position of the target object.
     Point aOwnerAnchorPos(0, 0);
 
+    assert(pObjList); // must never be null
     if (dynamic_cast< const SdrObjGroup* 
>(pObjList->getSdrObjectFromSdrObjList()) != nullptr)
     {
         aOwnerAnchorPos = 
pObjList->getSdrObjectFromSdrObjList()->GetAnchorPos();
@@ -725,6 +726,7 @@ void SdrUndoRemoveObj::Redo()
     {
         ImplUnmarkObject( mxObj.get() );
         E3DModifySceneSnapRectUpdater aUpdater(mxObj.get());
+        assert(pObjList); // must never be null
         pObjList->RemoveObject(mxObj->GetOrdNum());
     }
 
@@ -747,6 +749,7 @@ void SdrUndoInsertObj::Undo()
     {
         ImplUnmarkObject( mxObj.get() );
 
+        assert(pObjList); // must never be null
         rtl::Reference<SdrObject> pChkObj= 
pObjList->RemoveObject(mxObj->GetOrdNum());
         DBG_ASSERT(pChkObj.get()==mxObj.get(),"UndoInsertObj: 
RemoveObjNum!=mxObj");
     }
@@ -762,6 +765,7 @@ void SdrUndoInsertObj::Redo()
         // <InsertObject(..)>. Needed for correct Redo in Writer. (#i45952#)
         Point aAnchorPos( 0, 0 );
 
+        assert(pObjList); // must never be null
         if (dynamic_cast<const 
SdrObjGroup*>(pObjList->getSdrObjectFromSdrObjList()) != nullptr)
         {
             aAnchorPos = mxObj->GetAnchorPos();
@@ -857,12 +861,14 @@ void SdrUndoReplaceObj::Undo()
     DBG_ASSERT(mxNewObj->IsInserted(),"SdrUndoReplaceObj::Undo(): New object 
is not inserted!");
 
     ImplUnmarkObject( mxNewObj.get() );
+    assert(m_pObjList); // must never be null
     m_pObjList->ReplaceObject(mxObj.get(), mxNewObj->GetOrdNum());
 }
 
 void SdrUndoReplaceObj::Redo()
 {
     ImplUnmarkObject( mxObj.get() );
+    assert(m_pObjList); // must never be null
     m_pObjList->ReplaceObject(mxNewObj.get(), mxObj->GetOrdNum());
 
     // Trigger PageChangeCall

Reply via email to