diff --git a/embeddedobj/source/general/docholder.cxx b/embeddedobj/source/general/docholder.cxx index 2b1d08b08d18..76eebd5bea7f 100644 --- a/embeddedobj/source/general/docholder.cxx +++ b/embeddedobj/source/general/docholder.cxx @@ -156,7 +156,7 @@ DocumentHolder::DocumentHolder( uno::Reference< uno::XComponentContext > xContex m_bReadOnly( false ), m_bWaitForClose( false ), m_bAllowClosing( false ), - m_bDesktopTerminated( false ), + m_bTerminateListenerRegistered( false ), m_nNoBorderResizeReact( 0 ), m_nNoResizeReact( 0 ) { @@ -165,6 +165,7 @@ DocumentHolder::DocumentHolder( uno::Reference< uno::XComponentContext > xContex try { xDesktop->addTerminateListener( this ); + m_bTerminateListenerRegistered = true; } catch ( const uno::Exception& ) { @@ -198,8 +199,7 @@ DocumentHolder::~DocumentHolder() m_xInterceptor.clear(); } - if ( !m_bDesktopTerminated ) - FreeOffice(); + FreeOffice(); } @@ -233,6 +233,10 @@ void DocumentHolder::CloseFrame() void DocumentHolder::FreeOffice() { + // tdf#125846 - deregister listener only once since a second removal would check all listeners + if (!m_bTerminateListenerRegistered) + return; + m_bTerminateListenerRegistered = false; try { uno::Reference< frame::XDesktop2 > xDesktop = frame::Desktop::create( m_xContext ); xDesktop->removeTerminateListener( this ); @@ -1152,8 +1156,8 @@ void SAL_CALL DocumentHolder::notifyTermination( const lang::EventObject& aSourc { OSL_ENSURE( !m_xComponent.is(), "Just a disaster..." ); + m_bTerminateListenerRegistered = false; uno::Reference< frame::XDesktop > xDesktop( aSource.Source, uno::UNO_QUERY ); - m_bDesktopTerminated = true; if ( xDesktop.is() ) xDesktop->removeTerminateListener( static_cast(this) ); } diff --git a/embeddedobj/source/inc/docholder.hxx b/embeddedobj/source/inc/docholder.hxx index 2c221cc411c6..21e915d09e32 100644 --- a/embeddedobj/source/inc/docholder.hxx +++ b/embeddedobj/source/inc/docholder.hxx @@ -77,7 +77,7 @@ private: bool m_bWaitForClose; bool m_bAllowClosing; - bool m_bDesktopTerminated; + bool m_bTerminateListenerRegistered; sal_Int32 m_nNoBorderResizeReact; sal_Int32 m_nNoResizeReact;