sw/source/core/access/accfrmobj.cxx          |   15 ++-
 sw/source/core/doc/docdraw.cxx               |   12 +++
 sw/source/core/draw/dview.cxx                |  108 ++++++++++++++++-----------
 sw/source/core/frmedt/fecopy.cxx             |   25 +++---
 sw/source/core/frmedt/fefly1.cxx             |   13 ++-
 sw/source/core/frmedt/feshview.cxx           |   37 ++++++---
 sw/source/core/layout/anchoreddrawobject.cxx |    4 +
 sw/source/core/layout/anchoredobject.cxx     |   11 +-
 sw/source/core/layout/fly.cxx                |    4 -
 sw/source/core/layout/flylay.cxx             |   41 +++++-----
 sw/source/core/layout/frmtool.cxx            |   40 ++++++----
 sw/source/core/layout/pagechg.cxx            |   19 ++--
 sw/source/core/layout/trvlfrm.cxx            |   39 +++++----
 sw/source/core/txtnode/atrflyin.cxx          |    3 
 sw/source/core/undo/undraw.cxx               |   31 ++++---
 15 files changed, 242 insertions(+), 160 deletions(-)

New commits:
commit 67af2cc487450a274ae7ba988249c9c362eaa95d
Author:     Xisco Fauli <xiscofa...@libreoffice.org>
AuthorDate: Thu Apr 25 18:15:12 2024 +0200
Commit:     Christian Lohmaier <lohmaier+libreoff...@googlemail.com>
CommitDate: Thu May 16 19:58:34 2024 +0200

    sw: check GetUserCall
    
    It might return nullptr
    See 
https://crashreport.libreoffice.org/stats/signature/SwFEShell::ShouldObjectBeSelected(Point%20const%20&)
    
    Change-Id: Ia0ed355a7eb9084b9f57163ffbfe6b549c8bdb3f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166642
    Tested-by: Jenkins
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>
    (cherry picked from commit 495b5db74f0db59395ff68bacc8d8ca67595b66e)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166710
    Reviewed-by: Christian Lohmaier <lohmaier+libreoff...@googlemail.com>

diff --git a/sw/source/core/access/accfrmobj.cxx 
b/sw/source/core/access/accfrmobj.cxx
index f78dc2d155db..004ca4ab94e0 100644
--- a/sw/source/core/access/accfrmobj.cxx
+++ b/sw/source/core/access/accfrmobj.cxx
@@ -240,13 +240,16 @@ SwRect SwAccessibleChild::GetBox( const SwAccessibleMap& 
rAccMap ) const
         // by the mpFrame case above b) for genuine SdrObject this must be set
         // if it's connected to layout
         assert(dynamic_cast<SwDrawContact const*>(pContact));
-        SwPageFrame const*const pPage(const_cast<SwAnchoredObject *>(
-            pContact->GetAnchoredObj(mpDrawObj))->FindPageFrameOfAnchor());
-        if (pPage) // may end up here with partial layout -> not visible
+        if (pContact)
         {
-            aBox = SwRect( mpDrawObj->GetCurrentBoundRect() );
-            // tdf#91260 drawing object may be partially off-page
-            aBox.Intersection(pPage->getFrameArea());
+            SwPageFrame const*const pPage(const_cast<SwAnchoredObject *>(
+                pContact->GetAnchoredObj(mpDrawObj))->FindPageFrameOfAnchor());
+            if (pPage) // may end up here with partial layout -> not visible
+            {
+                aBox = SwRect( mpDrawObj->GetCurrentBoundRect() );
+                // tdf#91260 drawing object may be partially off-page
+                aBox.Intersection(pPage->getFrameArea());
+            }
         }
     }
     else if ( mpWindow )
diff --git a/sw/source/core/doc/docdraw.cxx b/sw/source/core/doc/docdraw.cxx
index 521ca2b0ba15..09b1d9afb697 100644
--- a/sw/source/core/doc/docdraw.cxx
+++ b/sw/source/core/doc/docdraw.cxx
@@ -68,6 +68,9 @@ static void lcl_AdjustPositioningAttr( SwDrawFrameFormat* 
_pFrameFormat,
     const SwContact* pContact = GetUserCall( &_rSdrObj );
     OSL_ENSURE( pContact, "<lcl_AdjustPositioningAttr(..)> - missing contact 
object." );
 
+    if (!pContact)
+        return;
+
     // determine position of new group object relative to its anchor frame 
position
     SwTwips nHoriRelPos = 0;
     SwTwips nVertRelPos = 0;
@@ -195,6 +198,9 @@ SwDrawContact* SwDoc::GroupSelection( SdrView& rDrawView )
 
         // Revoke anchor attribute.
         SwDrawContact *pMyContact = 
static_cast<SwDrawContact*>(GetUserCall(pObj));
+        if (!pMyContact)
+            return pNewContact;
+
         const SwFormatAnchor aAnch( pMyContact->GetFormat()->GetAnchor() );
 
         std::unique_ptr<SwUndoDrawGroup> pUndo;
@@ -216,6 +222,9 @@ SwDrawContact* SwDoc::GroupSelection( SdrView& rDrawView )
             pObj = rMrkList.GetMark( i )->GetMarkedSdrObj();
             SwDrawContact *pContact = 
static_cast<SwDrawContact*>(GetUserCall(pObj));
 
+            if (!pContact)
+                continue;
+
             // #i53320#
 #if OSL_DEBUG_LEVEL > 0
             SwAnchoredDrawObject* pAnchoredDrawObj =
@@ -352,6 +361,9 @@ void SwDoc::UnGroupSelection( SdrView& rDrawView )
                 {
                     SwDrawContact *pContact = 
static_cast<SwDrawContact*>(GetUserCall(pObj));
 
+                    if (!pContact)
+                        continue;
+
                     std::shared_ptr<SwTextBoxNode> pTextBoxNode;
                     if (auto pGroupFormat = pContact->GetFormat())
                         pTextBoxNode = pGroupFormat->GetOtherTextBoxFormats();
diff --git a/sw/source/core/draw/dview.cxx b/sw/source/core/draw/dview.cxx
index fe0db61925c4..39ecb982c00c 100644
--- a/sw/source/core/draw/dview.cxx
+++ b/sw/source/core/draw/dview.cxx
@@ -210,10 +210,14 @@ void SwDrawView::AddCustomHdl()
 {
     const SdrMarkList &rMrkList = GetMarkedObjectList();
 
-    if(rMrkList.GetMarkCount() != 1 || !GetUserCall(rMrkList.GetMark( 0 
)->GetMarkedSdrObj()))
+    if(rMrkList.GetMarkCount() != 1)
         return;
 
     SdrObject *pObj = rMrkList.GetMark(0)->GetMarkedSdrObj();
+    SwContact* pContact = ::GetUserCall( pObj );
+    if (!pContact)
+        return;
+
     // make code robust
     SwFrameFormat* pFrameFormat( ::FindFrameFormat( pObj ) );
     if ( !pFrameFormat )
@@ -236,7 +240,7 @@ void SwDrawView::AddCustomHdl()
     {
         // #i28701# - use last character rectangle saved at object
         // in order to avoid a format of the anchor frame
-        SwAnchoredObject* pAnchoredObj = ::GetUserCall( pObj 
)->GetAnchoredObj( pObj );
+        SwAnchoredObject* pAnchoredObj = pContact->GetAnchoredObj( pObj );
 
         // Invalidate/recalc LastCharRect which can contain invalid frame 
offset because
         // of later frame changes
@@ -360,7 +364,8 @@ void SwDrawView::MoveRepeatedObjs( const SwAnchoredObject& 
_rMovedAnchoredObj,
     {
         const SwContact* pContact = ::GetUserCall( 
_rMovedAnchoredObj.GetDrawObj() );
         assert(pContact && "SwDrawView::MoveRepeatedObjs(..) - missing contact 
object -> crash.");
-        pContact->GetAnchoredObjs( aAnchoredObjs );
+        if (pContact)
+            pContact->GetAnchoredObjs( aAnchoredObjs );
     }
 
     // check, if 'repeated' objects exists.
@@ -402,7 +407,8 @@ void SwDrawView::MoveRepeatedObjs( const SwAnchoredObject& 
_rMovedAnchoredObj,
         {
             const SwContact* pContact = ::GetUserCall( pChildObj );
             assert(pContact && "SwDrawView::MoveRepeatedObjs(..) - missing 
contact object -> crash.");
-            pContact->GetAnchoredObjs( aAnchoredObjs );
+            if (pContact)
+                pContact->GetAnchoredObjs( aAnchoredObjs );
         }
         // move 'repeated' ones to the same order number as the already moved 
one.
         const size_t nTmpNewPos = pChildObj->GetOrdNum();
@@ -449,8 +455,11 @@ void SwDrawView::ObjOrderChanged( SdrObject* pObj, size_t 
nOldPos,
         pDrawPage->RecalcObjOrdNums();
     const size_t nObjCount = pDrawPage->GetObjCount();
 
-    SwAnchoredObject* pMovedAnchoredObj =
-                                ::GetUserCall( pObj )->GetAnchoredObj( pObj );
+    SwContact* pContact = ::GetUserCall( pObj );
+    if (!pContact)
+        return;
+
+    SwAnchoredObject* pMovedAnchoredObj = pContact->GetAnchoredObj( pObj );
     const SwFlyFrame* pParentAnchoredObj =
                                 
pMovedAnchoredObj->GetAnchorFrame()->FindFlyFrame();
 
@@ -493,21 +502,22 @@ void SwDrawView::ObjOrderChanged( SdrObject* pObj, size_t 
nOldPos,
         if ( pTmpObj )
         {
             size_t nTmpNewPos( nNewPos );
-            if ( bMovedForward )
-            {
-                // move before the top 'repeated' object
-                const sal_uInt32 nTmpMaxOrdNum =
-                                    ::GetUserCall( pTmpObj )->GetMaxOrdNum();
-                if ( nTmpMaxOrdNum > nNewPos )
-                    nTmpNewPos = nTmpMaxOrdNum;
-            }
-            else
+            if (const SwContact* pContact2 = ::GetUserCall( pTmpObj ))
             {
-                // move behind the bottom 'repeated' object
-                const sal_uInt32 nTmpMinOrdNum =
-                                    ::GetUserCall( pTmpObj )->GetMinOrdNum();
-                if ( nTmpMinOrdNum < nNewPos )
-                    nTmpNewPos = nTmpMinOrdNum;
+                if ( bMovedForward )
+                {
+                    // move before the top 'repeated' object
+                    const sal_uInt32 nTmpMaxOrdNum = pContact2->GetMaxOrdNum();
+                    if ( nTmpMaxOrdNum > nNewPos )
+                        nTmpNewPos = nTmpMaxOrdNum;
+                }
+                else
+                {
+                    // move behind the bottom 'repeated' object
+                    const sal_uInt32 nTmpMinOrdNum = pContact2->GetMinOrdNum();
+                    if ( nTmpMinOrdNum < nNewPos )
+                        nTmpNewPos = nTmpMinOrdNum;
+                }
             }
             if ( nTmpNewPos != nNewPos )
             {
@@ -529,18 +539,25 @@ void SwDrawView::ObjOrderChanged( SdrObject* pObj, size_t 
nOldPos,
         {
             // determine position before the object before its top 'child' 
object
             const SdrObject* pTmpObj = pDrawPage->GetObj( nMaxChildOrdNum );
-            size_t nTmpNewPos = ::GetUserCall( pTmpObj )->GetMaxOrdNum() + 1;
-            if ( nTmpNewPos >= nObjCount )
+            if (SwContact* pContact2 = ::GetUserCall( pTmpObj ))
             {
-                --nTmpNewPos;
+                size_t nTmpNewPos = pContact2->GetMaxOrdNum() + 1;
+                if ( nTmpNewPos >= nObjCount )
+                {
+                    --nTmpNewPos;
+                }
+                // assure, that determined position isn't between 'repeated' 
objects
+                pTmpObj = pDrawPage->GetObj( nTmpNewPos );
+                pContact2 = ::GetUserCall( pTmpObj );
+                if (pContact2)
+                {
+                    nTmpNewPos = pContact2->GetMaxOrdNum();
+                    // apply new position
+                    pDrawPage->SetObjectOrdNum( nNewPos, nTmpNewPos );
+                    nNewPos = nTmpNewPos;
+                    pDrawPage->RecalcObjOrdNums();
+                }
             }
-            // assure, that determined position isn't between 'repeated' 
objects
-            pTmpObj = pDrawPage->GetObj( nTmpNewPos );
-            nTmpNewPos = ::GetUserCall( pTmpObj )->GetMaxOrdNum();
-            // apply new position
-            pDrawPage->SetObjectOrdNum( nNewPos, nTmpNewPos );
-            nNewPos = nTmpNewPos;
-            pDrawPage->RecalcObjOrdNums();
         }
     }
 
@@ -564,16 +581,18 @@ void SwDrawView::ObjOrderChanged( SdrObject* pObj, size_t 
nOldPos,
             if ( pTmpParentObj &&
                  pTmpParentObj->GetFrameFormat() != pParentFrameFormat )
             {
-                if ( bMovedForward )
+                if (const SwContact* pContact2 = ::GetUserCall( pTmpObj ))
                 {
-                    nTmpNewPos = ::GetUserCall( pTmpObj )->GetMaxOrdNum();
-                    pTmpObj = pDrawPage->GetObj( nTmpNewPos + 1 );
-                }
-                else
-                {
-                    nTmpNewPos = ::GetUserCall( pTmpParentObj->GetDrawObj() )
-                                                            ->GetMinOrdNum();
-                    pTmpObj = pTmpParentObj->GetDrawObj();
+                    if ( bMovedForward )
+                    {
+                        nTmpNewPos = pContact2->GetMaxOrdNum();
+                        pTmpObj = pDrawPage->GetObj( nTmpNewPos + 1 );
+                    }
+                    else
+                    {
+                        nTmpNewPos = pContact2->GetMinOrdNum();
+                        pTmpObj = pTmpParentObj->GetDrawObj();
+                    }
                 }
             }
             else
@@ -687,6 +706,9 @@ const SwFrame* SwDrawView::CalcAnchor()
         return nullptr;
 
     SdrObject* pObj = rMrkList.GetMark( 0 )->GetMarkedSdrObj();
+    SwDrawContact* pContact = static_cast<SwDrawContact*>(GetUserCall(pObj));
+    if (!pContact)
+        return nullptr;
 
     //Search for paragraph bound objects, otherwise only the
     //current anchor. Search only if we currently drag.
@@ -700,16 +722,15 @@ const SwFrame* SwDrawView::CalcAnchor()
     }
     else
     {
-        SwDrawContact *pC = static_cast<SwDrawContact*>(GetUserCall(pObj));
         // determine correct anchor position for 'virtual' drawing objects.
         // #i26791#
-        pAnch = pC->GetAnchorFrame( pObj );
+        pAnch = pContact->GetAnchorFrame( pObj );
         if( !pAnch )
         {
-            pC->ConnectToLayout();
+            pContact->ConnectToLayout();
             // determine correct anchor position for 'virtual' drawing objects.
             // #i26791#
-            pAnch = pC->GetAnchorFrame( pObj );
+            pAnch = pContact->GetAnchorFrame( pObj );
         }
         aMyRect = pObj->GetSnapRect();
     }
@@ -744,7 +765,6 @@ const SwFrame* SwDrawView::CalcAnchor()
         {
             const SwRect aRect( aPt.getX(), aPt.getY(), 1, 1 );
 
-            SwDrawContact* pContact = 
static_cast<SwDrawContact*>(GetUserCall(pObj));
             if ( pContact->GetAnchorFrame( pObj ) &&
                  pContact->GetAnchorFrame( pObj )->IsPageFrame() )
                 pAnch = pContact->GetPageFrame();
diff --git a/sw/source/core/frmedt/fecopy.cxx b/sw/source/core/frmedt/fecopy.cxx
index 69fae8bf0ae0..01eee5072fb6 100644
--- a/sw/source/core/frmedt/fecopy.cxx
+++ b/sw/source/core/frmedt/fecopy.cxx
@@ -195,18 +195,20 @@ void SwFEShell::Copy( SwDoc& rClpDoc, const OUString* 
pNewClpText )
             }
             else
             {
-                SwDrawContact *pContact = 
static_cast<SwDrawContact*>(GetUserCall( pObj ));
-                SwFrameFormat *pFormat = pContact->GetFormat();
-                SwFormatAnchor aAnchor( pFormat->GetAnchor() );
-                if ((RndStdIds::FLY_AT_PARA == aAnchor.GetAnchorId()) ||
-                    (RndStdIds::FLY_AT_CHAR == aAnchor.GetAnchorId()) ||
-                    (RndStdIds::FLY_AT_FLY  == aAnchor.GetAnchorId()) ||
-                    (RndStdIds::FLY_AS_CHAR == aAnchor.GetAnchorId()))
+                if (SwDrawContact *pContact = 
static_cast<SwDrawContact*>(GetUserCall( pObj )))
                 {
-                    aAnchor.SetAnchor( &aPos );
-                }
+                    SwFrameFormat *pFormat = pContact->GetFormat();
+                    SwFormatAnchor aAnchor( pFormat->GetAnchor() );
+                    if ((RndStdIds::FLY_AT_PARA == aAnchor.GetAnchorId()) ||
+                        (RndStdIds::FLY_AT_CHAR == aAnchor.GetAnchorId()) ||
+                        (RndStdIds::FLY_AT_FLY  == aAnchor.GetAnchorId()) ||
+                        (RndStdIds::FLY_AS_CHAR == aAnchor.GetAnchorId()))
+                    {
+                        aAnchor.SetAnchor( &aPos );
+                    }
 
-                rClpDoc.getIDocumentLayoutAccess().CopyLayoutFormat( *pFormat, 
aAnchor, true, true );
+                    rClpDoc.getIDocumentLayoutAccess().CopyLayoutFormat( 
*pFormat, aAnchor, true, true );
+                }
             }
         }
     }
@@ -297,6 +299,9 @@ bool SwFEShell::CopyDrawSel( SwFEShell& rDestShell, const 
Point& rSttPt,
         SdrObject *pObj = aMrkList.GetMark( i )->GetMarkedSdrObj();
 
         SwDrawContact *pContact = static_cast<SwDrawContact*>(GetUserCall( 
pObj ));
+        if (!pContact)
+            continue;
+
         SwFrameFormat *pFormat = pContact->GetFormat();
         const SwFormatAnchor& rAnchor = pFormat->GetAnchor();
 
diff --git a/sw/source/core/frmedt/fefly1.cxx b/sw/source/core/frmedt/fefly1.cxx
index 2e5b8bf53d15..644c5ccf0e40 100644
--- a/sw/source/core/frmedt/fefly1.cxx
+++ b/sw/source/core/frmedt/fefly1.cxx
@@ -382,11 +382,13 @@ const SwFrameFormat* SwFEShell::IsFlyInFly()
             return nullptr;
         return pFly->GetFormat();
     }
-    else if ( rMrkList.GetMarkCount() != 1 ||
-         !GetUserCall(rMrkList.GetMark( 0 )->GetMarkedSdrObj()) )
+    else if ( rMrkList.GetMarkCount() != 1 )
         return nullptr;
 
     SdrObject *pObj = rMrkList.GetMark( 0 )->GetMarkedSdrObj();
+    SwDrawContact *pContact = static_cast<SwDrawContact*>(GetUserCall(pObj));
+    if (!pContact)
+        return nullptr;
 
     SwFrameFormat *pFormat = FindFrameFormat( pObj );
     if( pFormat && RndStdIds::FLY_AT_FLY == pFormat->GetAnchor().GetAnchorId() 
)
@@ -398,7 +400,7 @@ const SwFrameFormat* SwFEShell::IsFlyInFly()
         }
         else
         {
-            pFly = 
static_cast<SwDrawContact*>(GetUserCall(pObj))->GetAnchorFrame(pObj);
+            pFly = pContact->GetAnchorFrame(pObj);
         }
 
         OSL_ENSURE( pFly, "IsFlyInFly: Where's my anchor?" );
@@ -491,11 +493,12 @@ Point SwFEShell::FindAnchorPos( const Point& rAbsPos, 
bool bMoveIt )
 
     SdrObject* pObj = rMrkList.GetMark(0)->GetMarkedSdrObj();
 
-    if (!GetUserCall(pObj))
+    SwContact* pContact = ::GetUserCall( pObj );
+    if (!pContact)
         return aRet;
 
     // #i28701#
-    SwAnchoredObject* pAnchoredObj = ::GetUserCall( pObj )->GetAnchoredObj( 
pObj );
+    SwAnchoredObject* pAnchoredObj = pContact->GetAnchoredObj( pObj );
     SwFrameFormat* pFormat = pAnchoredObj->GetFrameFormat();
     const RndStdIds nAnchorId = pFormat->GetAnchor().GetAnchorId();
 
diff --git a/sw/source/core/frmedt/feshview.cxx 
b/sw/source/core/frmedt/feshview.cxx
index 4ad0747619ee..353cb5214ea8 100644
--- a/sw/source/core/frmedt/feshview.cxx
+++ b/sw/source/core/frmedt/feshview.cxx
@@ -377,22 +377,27 @@ bool SwFEShell::MoveAnchor( SwMove nDir )
     const SdrMarkList& pMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
     if (1 != pMrkList.GetMarkCount())
         return false;
+
+    SdrObject *pObj = pMrkList.GetMark( 0 )->GetMarkedSdrObj();
+    SwDrawContact* pContact = static_cast<SwDrawContact*>(GetUserCall(pObj));
+    if (!pContact)
+        return false;
+
     SwFrame* pOld;
     SwFlyFrame* pFly = nullptr;
-    SdrObject *pObj = pMrkList.GetMark( 0 )->GetMarkedSdrObj();
     if (SwVirtFlyDrawObj* pVirtO = dynamic_cast<SwVirtFlyDrawObj*>(pObj))
     {
         pFly = pVirtO->GetFlyFrame();
         pOld = pFly->AnchorFrame();
     }
     else
-        pOld = static_cast<SwDrawContact*>(GetUserCall(pObj))->GetAnchorFrame( 
pObj );
+        pOld = pContact->GetAnchorFrame( pObj );
     bool bRet = false;
     if( pOld )
     {
         SwFrame* pNew = pOld;
         // #i28701#
-        SwAnchoredObject* pAnchoredObj = ::GetUserCall( pObj 
)->GetAnchoredObj( pObj );
+        SwAnchoredObject* pAnchoredObj = pContact->GetAnchoredObj( pObj );
         SwFrameFormat* pFormat = pAnchoredObj->GetFrameFormat();
         SwFormatAnchor aAnch( pFormat->GetAnchor() );
         RndStdIds nAnchorId = aAnch.GetAnchorId();
@@ -875,7 +880,11 @@ static void lcl_NotifyNeighbours( const SdrMarkList *pLst )
         }
         else
         {
-            SwFrame* pAnch = static_cast<SwDrawContact*>( GetUserCall(pO) 
)->GetAnchorFrame( pO );
+            SwDrawContact* pContact = 
static_cast<SwDrawContact*>(GetUserCall(pO));
+            if (!pContact)
+                continue;
+
+            SwFrame* pAnch = pContact->GetAnchorFrame( pO );
             if( !pAnch )
                 continue;
             pPage = pAnch->FindPageFrame();
@@ -1317,12 +1326,15 @@ bool SwFEShell::ShouldObjectBeSelected(const Point& rPt)
             {
                 if ( pObj->GetLayer() == rIDDMA.GetHellId() )
                 {
-                    const SwAnchoredObject* pAnchoredObj = ::GetUserCall( pObj 
)->GetAnchoredObj( pObj );
-                    const SwFrameFormat* pFormat = 
pAnchoredObj->GetFrameFormat();
-                    const SwFormatSurround& rSurround = pFormat->GetSurround();
-                    if ( rSurround.GetSurround() == 
css::text::WrapTextMode_THROUGH )
+                    if (const SwContact* pContact = ::GetUserCall( pObj ))
                     {
-                        bObjInBackground = true;
+                        const SwAnchoredObject* pAnchoredObj = 
pContact->GetAnchoredObj( pObj );
+                        const SwFrameFormat* pFormat = 
pAnchoredObj->GetFrameFormat();
+                        const SwFormatSurround& rSurround = 
pFormat->GetSurround();
+                        if ( rSurround.GetSurround() == 
css::text::WrapTextMode_THROUGH )
+                        {
+                            bObjInBackground = true;
+                        }
                     }
                 }
             }
@@ -2352,7 +2364,7 @@ bool SwFEShell::IsGroupSelected(bool bAllowDiagams)
             // Thus, use corresponding method instead of checking type.
             if ( pObj->IsGroupObject() &&
                  // --> #i38505# No ungroup allowed for 3d objects
-                 !pObj->Is3DObj() &&
+                 !pObj->Is3DObj() && GetUserCall(pObj) &&
                  RndStdIds::FLY_AS_CHAR != 
static_cast<SwDrawContact*>(GetUserCall(pObj))->
                                       GetFormat()->GetAnchor().GetAnchorId() )
             {
@@ -2681,7 +2693,6 @@ bool SwFEShell::GetObjAttr( SfxItemSet &rSet ) const
     {
         SdrObject *pObj = rMrkList.GetMark( i )->GetMarkedSdrObj();
         SwDrawContact *pContact = 
static_cast<SwDrawContact*>(GetUserCall(pObj));
-        // --> make code robust
         OSL_ENSURE( pContact, "<SwFEShell::GetObjAttr(..)> - missing 
<pContact>." );
         if ( pContact )
         {
@@ -2711,8 +2722,8 @@ void SwFEShell::SetObjAttr( const SfxItemSet& rSet )
     for ( size_t i = 0; i < rMrkList.GetMarkCount(); ++i )
     {
         SdrObject *pObj = rMrkList.GetMark( i )->GetMarkedSdrObj();
-        SwDrawContact *pContact = 
static_cast<SwDrawContact*>(GetUserCall(pObj));
-        GetDoc()->SetAttr( rSet, *pContact->GetFormat() );
+        if (SwDrawContact *pContact = 
static_cast<SwDrawContact*>(GetUserCall(pObj)))
+            GetDoc()->SetAttr( rSet, *pContact->GetFormat() );
     }
 
     EndUndo( SwUndoId::INSATTR );
diff --git a/sw/source/core/layout/anchoreddrawobject.cxx 
b/sw/source/core/layout/anchoreddrawobject.cxx
index 5a9e1245afd8..fe01bbc3b395 100644
--- a/sw/source/core/layout/anchoreddrawobject.cxx
+++ b/sw/source/core/layout/anchoreddrawobject.cxx
@@ -266,6 +266,8 @@ void SwAnchoredDrawObject::MakeObjPos()
 
     SwDrawContact* pDrawContact =
                         static_cast<SwDrawContact*>(::GetUserCall( 
GetDrawObj() ));
+    if (!pDrawContact)
+        return;
 
     // --> #i28749# - if anchored drawing object hasn't been yet
     // positioned, convert its positioning attributes, if its positioning
@@ -849,6 +851,8 @@ void SwAnchoredDrawObject::SetPositioningAttr()
 {
     SwDrawContact* pDrawContact =
                         static_cast<SwDrawContact*>(GetUserCall( GetDrawObj() 
));
+    if (!pDrawContact)
+        return;
 
     SwFrameFormat* pObjFormat = GetFrameFormat();
     if ( !pDrawContact->ObjAnchoredAsChar() )
diff --git a/sw/source/core/layout/anchoredobject.cxx 
b/sw/source/core/layout/anchoredobject.cxx
index a74438afb361..43c5baa396c5 100644
--- a/sw/source/core/layout/anchoredobject.cxx
+++ b/sw/source/core/layout/anchoredobject.cxx
@@ -44,10 +44,13 @@ SwObjPositioningInProgress::SwObjPositioningInProgress( 
SdrObject& _rSdrObj ) :
     // --> #i52904#
     mbOldObjPositioningInProgress( false )
 {
-    mpAnchoredObj = ::GetUserCall( &_rSdrObj )->GetAnchoredObj( &_rSdrObj );
-    // --> #i52904#
-    mbOldObjPositioningInProgress = mpAnchoredObj->IsPositioningInProgress();
-    mpAnchoredObj->SetPositioningInProgress( true );
+    if (SwContact* pContact = ::GetUserCall( &_rSdrObj ))
+    {
+        mpAnchoredObj = pContact->GetAnchoredObj( &_rSdrObj );
+        // --> #i52904#
+        mbOldObjPositioningInProgress = 
mpAnchoredObj->IsPositioningInProgress();
+        mpAnchoredObj->SetPositioningInProgress( true );
+    }
 }
 SwObjPositioningInProgress::SwObjPositioningInProgress( SwAnchoredObject& 
_rAnchoredObj ) :
     mpAnchoredObj( &_rAnchoredObj ),
diff --git a/sw/source/core/layout/fly.cxx b/sw/source/core/layout/fly.cxx
index db50a42de053..b454bd95917f 100644
--- a/sw/source/core/layout/fly.cxx
+++ b/sw/source/core/layout/fly.cxx
@@ -2528,8 +2528,8 @@ void SwFrame::AppendDrawObj( SwAnchoredObject& _rNewObj )
         assert(!m_pDrawObjs || m_pDrawObjs->is_sorted());
         // perform disconnect from layout, if 'master' drawing object is 
appended
         // to a new frame.
-        static_cast<SwDrawContact*>(::GetUserCall( _rNewObj.GetDrawObj() ))->
-                                                DisconnectFromLayout( false );
+        if (SwDrawContact* pContact = 
static_cast<SwDrawContact*>(::GetUserCall( _rNewObj.GetDrawObj() )))
+            pContact->DisconnectFromLayout( false );
         assert(!m_pDrawObjs || m_pDrawObjs->is_sorted());
     }
 
diff --git a/sw/source/core/layout/flylay.cxx b/sw/source/core/layout/flylay.cxx
index 7ac95d65e0d8..b0ef08a01f75 100644
--- a/sw/source/core/layout/flylay.cxx
+++ b/sw/source/core/layout/flylay.cxx
@@ -1430,27 +1430,30 @@ bool CalcClipRect( const SdrObject *pSdrObj, SwRect 
&rRect, bool bMove )
             }
             tools::Long nHeight = (9*aRectFnSet.GetHeight(rRect))/10;
             tools::Long nTop;
-            const SwFormat *pFormat = GetUserCall(pSdrObj)->GetFormat();
-            const SvxULSpaceItem &rUL = pFormat->GetULSpace();
-            if( bMove )
+            if (const SwContact* pContact = ::GetUserCall( pSdrObj ))
             {
-                nTop = aRectFnSet.IsVert() ? static_cast<const 
SwFlyInContentFrame*>(pFly)->GetRefPoint().X() :
-                               static_cast<const 
SwFlyInContentFrame*>(pFly)->GetRefPoint().Y();
-                nTop = aRectFnSet.YInc( nTop, -nHeight );
-                tools::Long nWidth = aRectFnSet.GetWidth(pFly->getFrameArea());
-                aRectFnSet.SetLeftAndWidth( rRect, aRectFnSet.IsVert() ?
-                            static_cast<const 
SwFlyInContentFrame*>(pFly)->GetRefPoint().Y() :
-                            static_cast<const 
SwFlyInContentFrame*>(pFly)->GetRefPoint().X(), nWidth );
-                nHeight = 2*nHeight - rUL.GetLower() - rUL.GetUpper();
-            }
-            else
-            {
-                nTop = aRectFnSet.YInc( 
aRectFnSet.GetBottom(pFly->getFrameArea()),
-                                           rUL.GetLower() - nHeight );
-                nHeight = 2*nHeight - 
aRectFnSet.GetHeight(pFly->getFrameArea())
-                          - rUL.GetLower() - rUL.GetUpper();
+                const SwFormat *pFormat = pContact->GetFormat();
+                const SvxULSpaceItem &rUL = pFormat->GetULSpace();
+                if( bMove )
+                {
+                    nTop = aRectFnSet.IsVert() ? static_cast<const 
SwFlyInContentFrame*>(pFly)->GetRefPoint().X() :
+                                   static_cast<const 
SwFlyInContentFrame*>(pFly)->GetRefPoint().Y();
+                    nTop = aRectFnSet.YInc( nTop, -nHeight );
+                    tools::Long nWidth = 
aRectFnSet.GetWidth(pFly->getFrameArea());
+                    aRectFnSet.SetLeftAndWidth( rRect, aRectFnSet.IsVert() ?
+                                static_cast<const 
SwFlyInContentFrame*>(pFly)->GetRefPoint().Y() :
+                                static_cast<const 
SwFlyInContentFrame*>(pFly)->GetRefPoint().X(), nWidth );
+                    nHeight = 2*nHeight - rUL.GetLower() - rUL.GetUpper();
+                }
+                else
+                {
+                    nTop = aRectFnSet.YInc( 
aRectFnSet.GetBottom(pFly->getFrameArea()),
+                                               rUL.GetLower() - nHeight );
+                    nHeight = 2*nHeight - 
aRectFnSet.GetHeight(pFly->getFrameArea())
+                              - rUL.GetLower() - rUL.GetUpper();
+                }
+                aRectFnSet.SetTopAndHeight( rRect, nTop, nHeight );
             }
-            aRectFnSet.SetTopAndHeight( rRect, nTop, nHeight );
         }
     }
     else
diff --git a/sw/source/core/layout/frmtool.cxx 
b/sw/source/core/layout/frmtool.cxx
index baf632d6ebff..38667bd5c428 100644
--- a/sw/source/core/layout/frmtool.cxx
+++ b/sw/source/core/layout/frmtool.cxx
@@ -297,6 +297,8 @@ void SwFrameNotify::ImplDestroy()
                 bool bNotify = false;
                 bool bNotifySize = false;
                 SwContact* pContact = ::GetUserCall( pObj->GetDrawObj() );
+                if (!pContact)
+                    continue;
                 const bool bAnchoredAsChar = pContact->ObjAnchoredAsChar();
                 if ( !bAnchoredAsChar )
                 {
@@ -1067,22 +1069,23 @@ void AppendObj(SwFrame *const pFrame, SwPageFrame 
*const pPage, SwFrameFormat *c
                             InsertObject(pSdrObj, pSdrObj->GetOrdNumDirect());
                 }
 
-                SwDrawContact* pNew =
-                    static_cast<SwDrawContact*>(GetUserCall( pSdrObj ));
-                if ( !pNew->GetAnchorFrame() )
-                {
-                    pFrame->AppendDrawObj( *(pNew->GetAnchoredObj( nullptr )) 
);
-                }
-                // OD 19.06.2003 #108784# - add 'virtual' drawing object,
-                // if necessary. But control objects have to be excluded.
-                else if ( !::CheckControlLayer( pSdrObj ) &&
-                          pNew->GetAnchorFrame() != pFrame &&
-                          !pNew->GetDrawObjectByAnchorFrame( *pFrame ) )
+                if (SwDrawContact* pNew = 
static_cast<SwDrawContact*>(GetUserCall( pSdrObj )))
                 {
-                    SwDrawVirtObj* pDrawVirtObj = pNew->AddVirtObj(*pFrame);
-                    pFrame->AppendDrawObj( *(pNew->GetAnchoredObj( 
pDrawVirtObj )) );
+                    if ( !pNew->GetAnchorFrame() )
+                    {
+                        pFrame->AppendDrawObj( *(pNew->GetAnchoredObj( nullptr 
)) );
+                    }
+                    // OD 19.06.2003 #108784# - add 'virtual' drawing object,
+                    // if necessary. But control objects have to be excluded.
+                    else if ( !::CheckControlLayer( pSdrObj ) &&
+                              pNew->GetAnchorFrame() != pFrame &&
+                              !pNew->GetDrawObjectByAnchorFrame( *pFrame ) )
+                    {
+                        SwDrawVirtObj* pDrawVirtObj = 
pNew->AddVirtObj(*pFrame);
+                        pFrame->AppendDrawObj( *(pNew->GetAnchoredObj( 
pDrawVirtObj )) );
 
-                    pDrawVirtObj->ActionChanged();
+                        pDrawVirtObj->ActionChanged();
+                    }
                 }
             }
             else
@@ -3598,8 +3601,13 @@ bool Is_Lower_Of(const SwFrame *pCurrFrame, const 
SdrObject* pObj)
     }
     else
     {
-        pFrame = 
static_cast<SwDrawContact*>(GetUserCall(pObj))->GetAnchorFrame(pObj);
-        aPos = pObj->GetCurrentBoundRect().TopLeft();
+        if (SwDrawContact* pC = static_cast<SwDrawContact*>(GetUserCall(pObj)))
+        {
+            pFrame = pC->GetAnchorFrame(pObj);
+            aPos = pObj->GetCurrentBoundRect().TopLeft();
+        }
+        else
+            return false;
     }
     OSL_ENSURE( pFrame, "8-( Fly is lost in Space." );
     pFrame = GetVirtualUpper( pFrame, aPos );
diff --git a/sw/source/core/layout/pagechg.cxx 
b/sw/source/core/layout/pagechg.cxx
index 6aad283273fc..2575c9827886 100644
--- a/sw/source/core/layout/pagechg.cxx
+++ b/sw/source/core/layout/pagechg.cxx
@@ -446,22 +446,21 @@ static void lcl_MakeObjs(const 
sw::FrameFormats<sw::SpzFrameFormat*>& rSpzs, SwP
             if ( bSdrObj )
             {
                 // OD 23.06.2003 #108784# - consider 'virtual' drawing objects
-                SwDrawContact *pContact =
-                            
static_cast<SwDrawContact*>(::GetUserCall(pSdrObj));
-                if ( auto pDrawVirtObj = dynamic_cast<SwDrawVirtObj *>( 
pSdrObj ) )
+                if (SwDrawContact *pContact =
+                            
static_cast<SwDrawContact*>(::GetUserCall(pSdrObj)))
                 {
-                    if ( pContact )
+                    if ( auto pDrawVirtObj = dynamic_cast<SwDrawVirtObj *>( 
pSdrObj ) )
                     {
                         pDrawVirtObj->RemoveFromWriterLayout();
                         pDrawVirtObj->RemoveFromDrawingPage();
                         pPg->AppendDrawObj( *(pContact->GetAnchoredObj( 
pDrawVirtObj )) );
                     }
-                }
-                else
-                {
-                    if ( pContact->GetAnchorFrame() )
-                        pContact->DisconnectFromLayout( false );
-                    pPg->AppendDrawObj( *(pContact->GetAnchoredObj( pSdrObj )) 
);
+                    else
+                    {
+                        if ( pContact->GetAnchorFrame() )
+                            pContact->DisconnectFromLayout( false );
+                        pPg->AppendDrawObj( *(pContact->GetAnchoredObj( 
pSdrObj )) );
+                    }
                 }
             }
             else
diff --git a/sw/source/core/layout/trvlfrm.cxx 
b/sw/source/core/layout/trvlfrm.cxx
index 89a5f03302ac..0e3d13570678 100644
--- a/sw/source/core/layout/trvlfrm.cxx
+++ b/sw/source/core/layout/trvlfrm.cxx
@@ -70,26 +70,29 @@ namespace {
         {
             const SwVirtFlyDrawObj* pObj =
                                 static_cast<const SwVirtFlyDrawObj*>(aIter());
-            const SwAnchoredObject* pAnchoredObj = GetUserCall( aIter() 
)->GetAnchoredObj( aIter() );
-            const SwFrameFormat* pObjFormat = pAnchoredObj->GetFrameFormat();
-            const SwFormatSurround& rSurround = pObjFormat->GetSurround();
-            const SvxOpaqueItem& rOpaque = pObjFormat->GetOpaque();
-            bool bInBackground = ( rSurround.GetSurround() == 
css::text::WrapTextMode_THROUGH ) && !rOpaque.GetValue();
-
-            bool bBackgroundMatches = bInBackground == bSearchBackground;
-
-            const SwFlyFrame* pFly = pObj ? pObj->GetFlyFrame() : nullptr;
-            if ( pFly && bBackgroundMatches &&
-                 ( ( pCMS && pCMS->m_bSetInReadOnly ) ||
-                   !pFly->IsProtected() ) &&
-                 pFly->GetModelPositionForViewPoint( pPos, aPoint, pCMS ) )
+            if (const SwContact* pContact = ::GetUserCall( aIter() ))
             {
-                bRet = true;
-                break;
-            }
+                const SwAnchoredObject* pAnchoredObj = 
pContact->GetAnchoredObj( aIter() );
+                const SwFrameFormat* pObjFormat = 
pAnchoredObj->GetFrameFormat();
+                const SwFormatSurround& rSurround = pObjFormat->GetSurround();
+                const SvxOpaqueItem& rOpaque = pObjFormat->GetOpaque();
+                bool bInBackground = ( rSurround.GetSurround() == 
css::text::WrapTextMode_THROUGH ) && !rOpaque.GetValue();
+
+                bool bBackgroundMatches = bInBackground == bSearchBackground;
+
+                const SwFlyFrame* pFly = pObj ? pObj->GetFlyFrame() : nullptr;
+                if ( pFly && bBackgroundMatches &&
+                     ( ( pCMS && pCMS->m_bSetInReadOnly ) ||
+                       !pFly->IsProtected() ) &&
+                     pFly->GetModelPositionForViewPoint( pPos, aPoint, pCMS ) )
+                {
+                    bRet = true;
+                    break;
+                }
 
-            if ( pCMS && pCMS->m_bStop )
-                return false;
+                if ( pCMS && pCMS->m_bStop )
+                    return false;
+            }
             aIter.Prev();
         }
         return bRet;
diff --git a/sw/source/core/txtnode/atrflyin.cxx 
b/sw/source/core/txtnode/atrflyin.cxx
index 28eb7b38e530..fbefb76fa851 100644
--- a/sw/source/core/txtnode/atrflyin.cxx
+++ b/sw/source/core/txtnode/atrflyin.cxx
@@ -197,7 +197,8 @@ void SwTextFlyCnt::SetAnchor( const SwTextNode *pNode )
         {
             if (SdrObject const*const pObj = pFormat->FindSdrObject())
             {   // tdf#123259 disconnect with *old* anchor position
-                
static_cast<SwDrawContact*>(::GetUserCall(pObj))->DisconnectFromLayout(false);
+                if (SwDrawContact* pContact = 
static_cast<SwDrawContact*>(::GetUserCall( pObj )))
+                    pContact->DisconnectFromLayout(false);
             }
         }
         pFormat->SetFormatAttr( aAnchor );  // only set the anchor
diff --git a/sw/source/core/undo/undraw.cxx b/sw/source/core/undo/undraw.cxx
index 134c6862971e..73a58a0f52e5 100644
--- a/sw/source/core/undo/undraw.cxx
+++ b/sw/source/core/undo/undraw.cxx
@@ -274,6 +274,8 @@ void SwUndoDrawGroup::RedoImpl(::sw::UndoRedoContext &)
         SdrObject* pObj = rSave.pObj;
 
         SwDrawContact *pContact = 
static_cast<SwDrawContact*>(GetUserCall(pObj));
+        if (!pContact)
+            continue;
 
         // Save the textboxes
         if (auto pOldTextBoxNode = rSave.pFormat->GetOtherTextBoxFormats())
@@ -350,23 +352,25 @@ SwUndoDrawUnGroup::SwUndoDrawUnGroup( SdrObjGroup* pObj, 
const SwDoc& rDoc )
     m_nSize = o3tl::narrowing<sal_uInt16>(pObj->GetSubList()->GetObjCount()) + 
1;
     m_pObjArray.reset( new SwUndoGroupObjImpl[ m_nSize ] );
 
-    SwDrawContact *pContact = static_cast<SwDrawContact*>(GetUserCall(pObj));
-    SwDrawFrameFormat* pFormat = 
static_cast<SwDrawFrameFormat*>(pContact->GetFormat());
+    if (SwDrawContact *pContact = 
static_cast<SwDrawContact*>(GetUserCall(pObj)))
+    {
+        SwDrawFrameFormat* pFormat = 
static_cast<SwDrawFrameFormat*>(pContact->GetFormat());
 
-    m_pObjArray[0].pObj = pObj;
-    m_pObjArray[0].pFormat = pFormat;
+        m_pObjArray[0].pObj = pObj;
+        m_pObjArray[0].pFormat = pFormat;
 
-    // object will destroy itself
-    pContact->Changed( *pObj, SdrUserCallType::Delete, 
pObj->GetLastBoundRect() );
-    pObj->SetUserCall( nullptr );
+        // object will destroy itself
+        pContact->Changed( *pObj, SdrUserCallType::Delete, 
pObj->GetLastBoundRect() );
+        pObj->SetUserCall( nullptr );
 
-    ::lcl_SaveAnchor( pFormat, m_pObjArray[0].nNodeIdx );
+        ::lcl_SaveAnchor( pFormat, m_pObjArray[0].nNodeIdx );
 
-    pFormat->RemoveAllUnos();
+        pFormat->RemoveAllUnos();
 
-    // remove from array
-    sw::SpzFrameFormats& rFlyFormats = 
*pFormat->GetDoc()->GetSpzFrameFormats();
-    rFlyFormats.erase( std::find( rFlyFormats.begin(), rFlyFormats.end(), 
pFormat ));
+        // remove from array
+        sw::SpzFrameFormats& rFlyFormats = 
*pFormat->GetDoc()->GetSpzFrameFormats();
+        rFlyFormats.erase( std::find( rFlyFormats.begin(), rFlyFormats.end(), 
pFormat ));
+    }
 }
 
 SwUndoDrawUnGroup::~SwUndoDrawUnGroup()
@@ -622,6 +626,9 @@ void SwUndoDrawDelete::RedoImpl(::sw::UndoRedoContext & 
rContext)
         SwUndoGroupObjImpl& rSave = m_pObjArray[n];
         SdrObject *pObj = rSave.pObj;
         SwDrawContact *pContact = 
static_cast<SwDrawContact*>(GetUserCall(pObj));
+        if (!pContact)
+            continue;
+
         SwDrawFrameFormat *pFormat = 
static_cast<SwDrawFrameFormat*>(pContact->GetFormat());
 
         // object will destroy itself

Reply via email to