Kaydet (Commit) fae6699c authored tarafından Michael Stahl's avatar Michael Stahl

sfx2: fix VBA crash when disposing SfxBaseModel

Crash on WNT in CppunitTest_sw_globalfilter testSkipImages()

SfxBaseModel::dispose() calls some event listener that deletes the
BasicManager instance; unfortunately SfxObjectShell_Impl has a
SfxBasicHolder member that still refers to the deleted BasicManager
and then something calls vba::getVBAServiceFactory()...

Try to fix that by clearing the SfxBasicHolder member via SfxListener.

Change-Id: I65f2ec8e9eb598be218136c06ed8de35a464a971
üst d360477d
...@@ -43,6 +43,19 @@ SfxBasicManagerHolder::SfxBasicManagerHolder() ...@@ -43,6 +43,19 @@ SfxBasicManagerHolder::SfxBasicManagerHolder()
{ {
} }
void SfxBasicManagerHolder::Notify(SfxBroadcaster& rBC, SfxHint const& rHint)
{
if (!mpBasicManager || &rBC != mpBasicManager)
return;
SfxSimpleHint const*const pSimpleHint(dynamic_cast<SfxSimpleHint const*>(&rHint));
if (pSimpleHint && SFX_HINT_DYING == pSimpleHint->GetId())
{
mpBasicManager = nullptr;
mxBasicContainer.clear();
mxDialogContainer.clear();
}
}
void SfxBasicManagerHolder::reset( BasicManager* _pBasicManager ) void SfxBasicManagerHolder::reset( BasicManager* _pBasicManager )
{ {
impl_releaseContainers(); impl_releaseContainers();
...@@ -59,6 +72,7 @@ void SfxBasicManagerHolder::reset( BasicManager* _pBasicManager ) ...@@ -59,6 +72,7 @@ void SfxBasicManagerHolder::reset( BasicManager* _pBasicManager )
if ( mpBasicManager ) if ( mpBasicManager )
{ {
StartListening(*mpBasicManager);
try try
{ {
mxBasicContainer.set( mpBasicManager->GetScriptLibraryContainer(), UNO_QUERY_THROW ); mxBasicContainer.set( mpBasicManager->GetScriptLibraryContainer(), UNO_QUERY_THROW );
......
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
#ifndef INCLUDED_SFX2_SOURCE_INC_APPBASLIB_HXX #ifndef INCLUDED_SFX2_SOURCE_INC_APPBASLIB_HXX
#define INCLUDED_SFX2_SOURCE_INC_APPBASLIB_HXX #define INCLUDED_SFX2_SOURCE_INC_APPBASLIB_HXX
#include <svl/lstner.hxx>
#include <com/sun/star/uno/Sequence.hxx> #include <com/sun/star/uno/Sequence.hxx>
#include <com/sun/star/script/XStorageBasedLibraryContainer.hpp> #include <com/sun/star/script/XStorageBasedLibraryContainer.hpp>
#include <com/sun/star/embed/XStorage.hpp> #include <com/sun/star/embed/XStorage.hpp>
...@@ -29,6 +31,7 @@ class BasicManager; ...@@ -29,6 +31,7 @@ class BasicManager;
/** helper class which holds and manipulates a BasicManager /** helper class which holds and manipulates a BasicManager
*/ */
class SfxBasicManagerHolder class SfxBasicManagerHolder
: public SfxListener
{ {
private: private:
BasicManager* mpBasicManager; BasicManager* mpBasicManager;
...@@ -84,6 +87,7 @@ public: ...@@ -84,6 +87,7 @@ public:
*/ */
bool LegacyPsswdBinaryLimitExceeded( ::com::sun::star::uno::Sequence< OUString >& sModules ); bool LegacyPsswdBinaryLimitExceeded( ::com::sun::star::uno::Sequence< OUString >& sModules );
virtual void Notify(SfxBroadcaster& rBC, SfxHint const& rHint) SAL_OVERRIDE;
private: private:
void impl_releaseContainers(); void impl_releaseContainers();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment