summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sfx2/source/control/bindings.cxx3
-rw-r--r--sfx2/source/control/dispatch.cxx16
-rw-r--r--sfx2/source/view/viewfrm.cxx4
3 files changed, 14 insertions, 9 deletions
diff --git a/sfx2/source/control/bindings.cxx b/sfx2/source/control/bindings.cxx
index 659d72254868..ffafadfeb2a6 100644
--- a/sfx2/source/control/bindings.cxx
+++ b/sfx2/source/control/bindings.cxx
@@ -944,6 +944,9 @@ SfxPoolItemHolder SfxBindings::Execute_Impl( sal_uInt16 nId, const SfxPoolItem**
pSlot = pServer->GetSlot();
}
+ if (!pShell)
+ return SfxPoolItemHolder();
+
SfxItemPool &rPool = pShell->GetPool();
SfxRequest aReq( nId, nCallMode, rPool );
aReq.SetModifier( nModi );
diff --git a/sfx2/source/control/dispatch.cxx b/sfx2/source/control/dispatch.cxx
index d16a099b9578..d0ebae89f73d 100644
--- a/sfx2/source/control/dispatch.cxx
+++ b/sfx2/source/control/dispatch.cxx
@@ -707,7 +707,7 @@ bool SfxDispatcher::GetShellAndSlot_Impl(sal_uInt16 nSlot, SfxShell** ppShell,
*ppShell = GetShell(aSvr.GetShellLevel());
*ppSlot = aSvr.GetSlot();
- if ( nullptr == (*ppSlot)->GetExecFnc() && bRealSlot )
+ if ( nullptr == (*ppSlot)->GetExecFnc() && bRealSlot && *ppShell )
*ppSlot = (*ppShell)->GetInterface()->GetRealSlot(*ppSlot);
// Check only real slots as enum slots don't have an execute function!
return !bRealSlot || ((nullptr != *ppSlot) && (nullptr != (*ppSlot)->GetExecFnc()) );
@@ -985,13 +985,15 @@ void SfxDispatcher::PostMsgHandler(std::unique_ptr<SfxRequest> pReq)
SfxSlotServer aSvr;
if ( FindServer_(pReq->GetSlot(), aSvr ) ) // HACK(x), whatever that was supposed to mean
{
- const SfxSlot *pSlot = aSvr.GetSlot();
- SfxShell *pSh = GetShell(aSvr.GetShellLevel());
+ if (SfxShell *pSh = GetShell(aSvr.GetShellLevel()))
+ {
+ const SfxSlot *pSlot = aSvr.GetSlot();
- // When the pSlot is a "Pseudoslot" for macros or Verbs, it can
- // be destroyed in the Call_Impl, thus do not use it anymore!
- pReq->SetSynchronCall( false );
- Call_Impl( *pSh, *pSlot, *pReq, pReq->AllowsRecording() ); //! why bRecord?
+ // When the pSlot is a "Pseudoslot" for macros or Verbs, it can
+ // be destroyed in the Call_Impl, thus do not use it anymore!
+ pReq->SetSynchronCall( false );
+ Call_Impl( *pSh, *pSlot, *pReq, pReq->AllowsRecording() ); //! why bRecord?
+ }
}
}
else
diff --git a/sfx2/source/view/viewfrm.cxx b/sfx2/source/view/viewfrm.cxx
index c79d766676e8..cb93b9c000de 100644
--- a/sfx2/source/view/viewfrm.cxx
+++ b/sfx2/source/view/viewfrm.cxx
@@ -1094,8 +1094,8 @@ void SfxViewFrame::PopShellAndSubShells_Impl( SfxViewShell& i_rViewShell )
if ( nLevel )
{
// more sub shells on the stack, which were not affected by PopSubShells_Impl
- SfxShell *pSubShell = m_pDispatcher->GetShell( nLevel-1 );
- m_pDispatcher->Pop( *pSubShell, SfxDispatcherPopFlags::POP_UNTIL | SfxDispatcherPopFlags::POP_DELETE );
+ if (SfxShell *pSubShell = m_pDispatcher->GetShell( nLevel-1 ))
+ m_pDispatcher->Pop( *pSubShell, SfxDispatcherPopFlags::POP_UNTIL | SfxDispatcherPopFlags::POP_DELETE );
}
m_pDispatcher->Pop( i_rViewShell );
m_pDispatcher->Flush();