[Libreoffice-commits] core.git: include/sfx2 sfx2/source

Noel Grandin (via logerrit) logerrit at kemper.freedesktop.org
Thu Aug 13 13:22:15 UTC 2020


 include/sfx2/msgpool.hxx        |    1 -
 sfx2/source/appl/app.cxx        |    2 +-
 sfx2/source/appl/appchild.cxx   |    4 ++--
 sfx2/source/appl/appdata.cxx    |   29 ++++++++++-------------------
 sfx2/source/appl/appinit.cxx    |   26 +++++++++++++-------------
 sfx2/source/appl/appmain.cxx    |    4 ++--
 sfx2/source/appl/appmisc.cxx    |    2 +-
 sfx2/source/appl/appquit.cxx    |   26 +++++++++++++-------------
 sfx2/source/control/msgpool.cxx |   10 ----------
 sfx2/source/control/objface.cxx |   14 --------------
 sfx2/source/inc/appdata.hxx     |   34 +++++++++++++++++++++-------------
 11 files changed, 63 insertions(+), 89 deletions(-)

New commits:
commit eaf094f7f2699e786deaa8cfadad26507b30a92b
Author:     Noel Grandin <noel.grandin at collabora.co.uk>
AuthorDate: Wed Aug 12 14:40:09 2020 +0200
Commit:     Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Thu Aug 13 15:21:29 2020 +0200

    use unique_ptr in SfxAppData_Impl
    
    and simplify the destruction - we only ever called ReleaseInterface
    on destruction, so no need to bother with that, and risk touching
    pointers that might be nullptr
    
    Specifically, the problem is this code
        pImpl->pSlotPool.reset();
    which triggered the path
        ~SfxSlotPool -> ~SfxInterface -> SfxGetpApp()->GetAppSlotPool_Impl()
    which crashes because the pSlotPool pointer is null at that point
    
    Change-Id: I8577760d09be598926623d6eb5500969e07dd6f8
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100624
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/include/sfx2/msgpool.hxx b/include/sfx2/msgpool.hxx
index 357d86d67bed..7aa38904c35d 100644
--- a/include/sfx2/msgpool.hxx
+++ b/include/sfx2/msgpool.hxx
@@ -47,7 +47,6 @@ public:
     ~SfxSlotPool();
 
     void                RegisterInterface( SfxInterface& rFace );
-    void                ReleaseInterface( SfxInterface& rFace );
 
     static SfxSlotPool& GetSlotPool( SfxViewFrame *pFrame=nullptr );
 
diff --git a/sfx2/source/appl/app.cxx b/sfx2/source/appl/app.cxx
index 6844f919c4b2..fbd45b3e49b3 100644
--- a/sfx2/source/appl/app.cxx
+++ b/sfx2/source/appl/app.cxx
@@ -235,7 +235,7 @@ void SfxApplication::ResetLastDir()
 
 SfxDispatcher* SfxApplication::GetDispatcher_Impl()
 {
-    return pImpl->pViewFrame? pImpl->pViewFrame->GetDispatcher(): pImpl->pAppDispat;
+    return pImpl->pViewFrame ? pImpl->pViewFrame->GetDispatcher() : pImpl->pAppDispat.get();
 }
 
 
diff --git a/sfx2/source/appl/appchild.cxx b/sfx2/source/appl/appchild.cxx
index 0aaf722ba700..9ee356566479 100644
--- a/sfx2/source/appl/appchild.cxx
+++ b/sfx2/source/appl/appchild.cxx
@@ -39,7 +39,7 @@ void SfxApplication::RegisterChildWindow_Impl( SfxModule *pMod, std::unique_ptr<
     }
 
     if (!pImpl->pFactArr)
-        pImpl->pFactArr = new SfxChildWinFactArr_Impl;
+        pImpl->pFactArr.reset(new SfxChildWinFactArr_Impl);
 
     for (size_t nFactory=0; nFactory<pImpl->pFactArr->size(); ++nFactory)
     {
@@ -83,7 +83,7 @@ void SfxApplication::RegisterChildWindowContext_Impl( SfxModule *pMod, sal_uInt1
         DBG_ASSERT( pImpl, "No AppData!" );
         DBG_ASSERT( pImpl->pFactArr, "No Factories!" );
 
-        pFactories = pImpl->pFactArr;
+        pFactories = pImpl->pFactArr.get();
         sal_uInt16 nCount = pFactories->size();
         for (sal_uInt16 nFactory=0; nFactory<nCount; ++nFactory)
         {
diff --git a/sfx2/source/appl/appdata.cxx b/sfx2/source/appl/appdata.cxx
index fdc3f0304df2..0039cdae17a5 100644
--- a/sfx2/source/appl/appdata.cxx
+++ b/sfx2/source/appl/appdata.cxx
@@ -21,12 +21,18 @@
 
 #include <appdata.hxx>
 #include <sfxpicklist.hxx>
+#include <sfx2/dispatch.hxx>
 #include <sfx2/doctempl.hxx>
+#include <sfx2/fcontnr.hxx>
 #include <sfx2/module.hxx>
+#include <sfx2/msgpool.hxx>
 #include <sfx2/sidebar/Theme.hxx>
 #include <sfx2/objsh.hxx>
-#include <unoctitm.hxx>
 #include <appbaslib.hxx>
+#include <childwinimpl.hxx>
+#include <ctrlfactoryimpl.hxx>
+#include <shellimpl.hxx>
+#include <unoctitm.hxx>
 #include <svl/svdde.hxx>
 
 #include <basic/basicmanagerrepository.hxx>
@@ -68,28 +74,13 @@ void SfxBasicManagerCreationListener::onBasicManagerCreated( const Reference< XM
 }
 
 SfxAppData_Impl::SfxAppData_Impl()
-    : pFactArr(nullptr)
-    , pMatcher( nullptr )
-    , m_pToolsErrorHdl(nullptr)
-    , m_pSoErrorHdl(nullptr)
-#if HAVE_FEATURE_SCRIPTING
-    , m_pSbxErrorHdl(nullptr)
-#endif
-    , pTemplates( nullptr )
-    , pPool(nullptr)
+    : pPool(nullptr)
     , pProgress(nullptr)
     , nDocModalMode(0)
     , nRescheduleLocks(0)
-    , pTbxCtrlFac(nullptr)
-    , pStbCtrlFac(nullptr)
-    , pViewFrames(nullptr)
-    , pViewShells(nullptr)
-    , pObjShells(nullptr)
     , pBasicManager( new SfxBasicManagerHolder )
     , pBasMgrListener( new SfxBasicManagerCreationListener( *this ) )
     , pViewFrame( nullptr )
-    , pSlotPool( nullptr )
-    , pAppDispat( nullptr )
     , bDowning( true )
     , bInQuit( false )
 
@@ -117,10 +108,10 @@ SfxAppData_Impl::~SfxAppData_Impl()
 SfxDocumentTemplates* SfxAppData_Impl::GetDocumentTemplates()
 {
     if ( !pTemplates )
-        pTemplates = new SfxDocumentTemplates;
+        pTemplates.reset(new SfxDocumentTemplates);
     else
         pTemplates->ReInitFromComponent();
-    return pTemplates;
+    return pTemplates.get();
 }
 
 void SfxAppData_Impl::OnApplicationBasicManagerCreated( BasicManager& _rBasicManager )
diff --git a/sfx2/source/appl/appinit.cxx b/sfx2/source/appl/appinit.cxx
index 3ebc6a83bf5d..fbecd9d66b61 100644
--- a/sfx2/source/appl/appinit.cxx
+++ b/sfx2/source/appl/appinit.cxx
@@ -190,14 +190,14 @@ void SfxApplication::Initialize_Impl()
     Help::EnableContextHelp();
     Help::EnableExtHelp();
 
-    pImpl->m_pToolsErrorHdl = new SfxErrorHandler(
-        RID_ERRHDL, ErrCodeArea::Io, ErrCodeArea::Vcl);
+    pImpl->m_pToolsErrorHdl.reset(new SfxErrorHandler(
+        RID_ERRHDL, ErrCodeArea::Io, ErrCodeArea::Vcl));
 
-    pImpl->m_pSoErrorHdl = new SfxErrorHandler(
-        RID_SO_ERROR_HANDLER, ErrCodeArea::So, ErrCodeArea::So, SvtResLocale());
+    pImpl->m_pSoErrorHdl.reset(new SfxErrorHandler(
+        RID_SO_ERROR_HANDLER, ErrCodeArea::So, ErrCodeArea::So, SvtResLocale()));
 #if HAVE_FEATURE_SCRIPTING
-    pImpl->m_pSbxErrorHdl = new SfxErrorHandler(
-        RID_BASIC_START, ErrCodeArea::Sbx, ErrCodeArea::Sbx, BasResLocale());
+    pImpl->m_pSbxErrorHdl.reset(new SfxErrorHandler(
+        RID_BASIC_START, ErrCodeArea::Sbx, ErrCodeArea::Sbx, BasResLocale()));
 #endif
 
     if (!utl::ConfigManager::IsFuzzing())
@@ -209,13 +209,13 @@ void SfxApplication::Initialize_Impl()
     }
 
     DBG_ASSERT( !pImpl->pAppDispat, "AppDispatcher already exists" );
-    pImpl->pAppDispat = new SfxDispatcher;
-    pImpl->pSlotPool = new SfxSlotPool;
-    pImpl->pTbxCtrlFac = new SfxTbxCtrlFactArr_Impl;
-    pImpl->pStbCtrlFac = new SfxStbCtrlFactArr_Impl;
-    pImpl->pViewFrames = new SfxViewFrameArr_Impl;
-    pImpl->pViewShells = new SfxViewShellArr_Impl;
-    pImpl->pObjShells = new SfxObjectShellArr_Impl;
+    pImpl->pAppDispat.reset(new SfxDispatcher);
+    pImpl->pSlotPool.reset(new SfxSlotPool);
+    pImpl->pTbxCtrlFac.reset(new SfxTbxCtrlFactArr_Impl);
+    pImpl->pStbCtrlFac.reset(new SfxStbCtrlFactArr_Impl);
+    pImpl->pViewFrames.reset(new SfxViewFrameArr_Impl);
+    pImpl->pViewShells.reset(new SfxViewShellArr_Impl);
+    pImpl->pObjShells.reset(new SfxObjectShellArr_Impl);
 
     Registrations_Impl();
 
diff --git a/sfx2/source/appl/appmain.cxx b/sfx2/source/appl/appmain.cxx
index 31295cd0f5ae..884c4fd4db39 100644
--- a/sfx2/source/appl/appmain.cxx
+++ b/sfx2/source/appl/appmain.cxx
@@ -28,9 +28,9 @@ SfxFilterMatcher& SfxApplication::GetFilterMatcher()
 {
     if( !pImpl->pMatcher )
     {
-        pImpl->pMatcher = new SfxFilterMatcher();
+        pImpl->pMatcher.reset(new SfxFilterMatcher());
         URIHelper::SetMaybeFileHdl( LINK(
-            pImpl->pMatcher, SfxFilterMatcher, MaybeFileHdl_Impl ) );
+            pImpl->pMatcher.get(), SfxFilterMatcher, MaybeFileHdl_Impl ) );
     }
     return *pImpl->pMatcher;
 }
diff --git a/sfx2/source/appl/appmisc.cxx b/sfx2/source/appl/appmisc.cxx
index ada8f86eed04..53613b8921d9 100644
--- a/sfx2/source/appl/appmisc.cxx
+++ b/sfx2/source/appl/appmisc.cxx
@@ -99,7 +99,7 @@ SfxModule* SfxApplication::GetModule_Impl()
 }
 
 bool  SfxApplication::IsDowning() const { return pImpl->bDowning; }
-SfxDispatcher* SfxApplication::GetAppDispatcher_Impl() { return pImpl->pAppDispat; }
+SfxDispatcher* SfxApplication::GetAppDispatcher_Impl() { return pImpl->pAppDispat.get(); }
 SfxSlotPool& SfxApplication::GetAppSlotPool_Impl() const { return *pImpl->pSlotPool; }
 
 static bool FileExists( const INetURLObject& rURL )
diff --git a/sfx2/source/appl/appquit.cxx b/sfx2/source/appl/appquit.cxx
index 7b17c538c14f..829cc7601770 100644
--- a/sfx2/source/appl/appquit.cxx
+++ b/sfx2/source/appl/appquit.cxx
@@ -54,7 +54,7 @@ void SfxApplication::Deinitialize()
 
     pImpl->bDowning = true; // due to Timer from DecAliveCount and QueryExit
 
-    DELETEZ( pImpl->pTemplates );
+    pImpl->pTemplates.reset();
 
     // By definition there shouldn't be any open view frames when we reach
     // this method. Therefore this call makes no sense and is the source of
@@ -82,19 +82,19 @@ void SfxApplication::Deinitialize()
     DBG_ASSERT( pImpl->pViewFrame == nullptr, "active foreign ViewFrame" );
 
     // free administration managers
-    DELETEZ(pImpl->pAppDispat);
+    pImpl->pAppDispat.reset();
 
     // from here no SvObjects have to exists
-    DELETEZ(pImpl->pMatcher);
+    pImpl->pMatcher.reset();
 
-    DELETEZ(pImpl->pSlotPool);
-    DELETEZ(pImpl->pFactArr);
+    pImpl->pSlotPool.reset();
+    pImpl->pFactArr.reset();
 
-    DELETEZ(pImpl->pTbxCtrlFac);
-    DELETEZ(pImpl->pStbCtrlFac);
-    DELETEZ(pImpl->pViewFrames);
-    DELETEZ(pImpl->pViewShells);
-    DELETEZ(pImpl->pObjShells);
+    pImpl->pTbxCtrlFac.reset();
+    pImpl->pStbCtrlFac.reset();
+    pImpl->pViewFrames.reset();
+    pImpl->pViewShells.reset();
+    pImpl->pObjShells.reset();
 
     //TODO/CLEANUP
     //ReleaseArgs could be used instead!
@@ -102,10 +102,10 @@ void SfxApplication::Deinitialize()
     NoChaos::ReleaseItemPool();
 
 #if HAVE_FEATURE_SCRIPTING
-    delete pImpl->m_pSbxErrorHdl;
+    pImpl->m_pSbxErrorHdl.reset();
 #endif
-    delete pImpl->m_pSoErrorHdl;
-    delete pImpl->m_pToolsErrorHdl;
+    pImpl->m_pSoErrorHdl.reset();
+    pImpl->m_pToolsErrorHdl.reset();
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/control/msgpool.cxx b/sfx2/source/control/msgpool.cxx
index 28a1c8ba885b..be4ebdaa67f9 100644
--- a/sfx2/source/control/msgpool.cxx
+++ b/sfx2/source/control/msgpool.cxx
@@ -150,16 +150,6 @@ const std::type_info* SfxSlotPool::GetSlotType( sal_uInt16 nId ) const
 }
 
 
-// unregisters the availability of the Interface of functions
-
-void SfxSlotPool::ReleaseInterface( SfxInterface& rInterface )
-{
-    // remove from the list of SfxInterface instances
-    auto i = std::find(_vInterfaces.begin(), _vInterfaces.end(), &rInterface);
-    if(i != _vInterfaces.end())
-        _vInterfaces.erase(i);
-}
-
 // get the first SfxMessage for a special Id (e.g. for getting check-mode)
 
 const SfxSlot* SfxSlotPool::GetSlot( sal_uInt16 nId ) const
diff --git a/sfx2/source/control/objface.cxx b/sfx2/source/control/objface.cxx
index d794d715a9c2..f995eb9184e6 100644
--- a/sfx2/source/control/objface.cxx
+++ b/sfx2/source/control/objface.cxx
@@ -185,20 +185,6 @@ void SfxInterface::SetSlotMap( SfxSlot& rSlotMap, sal_uInt16 nSlotCount )
 
 SfxInterface::~SfxInterface()
 {
-    SfxModule *pMod = pImplData->pModule;
-    bool bRegistered = pImplData->bRegistered;
-    assert( bRegistered );
-    if ( bRegistered )
-    {
-        if ( pMod )
-        {
-            // can return nullptr if we are called from the SfxSlotPool destructor
-            if (pMod->GetSlotPool())
-                pMod->GetSlotPool()->ReleaseInterface(*this);
-        }
-        else
-            SfxGetpApp()->GetAppSlotPool_Impl().ReleaseInterface(*this);
-    }
 }
 
 
diff --git a/sfx2/source/inc/appdata.hxx b/sfx2/source/inc/appdata.hxx
index 2e46ce22eb92..f36a25f176e6 100644
--- a/sfx2/source/inc/appdata.hxx
+++ b/sfx2/source/inc/appdata.hxx
@@ -73,19 +73,20 @@ public:
     std::unique_ptr<DdeService>              pDdeService2;
 
     // single instance classes
-    SfxChildWinFactArr_Impl*            pFactArr;
+    std::unique_ptr<SfxChildWinFactArr_Impl>
+                                        pFactArr;
     std::vector<SfxFrame*>              vTopFrames;
 
     // application members
-    SfxFilterMatcher*                   pMatcher;
-    SfxErrorHandler *m_pToolsErrorHdl;
-    SfxErrorHandler *m_pSoErrorHdl;
+    std::unique_ptr<SfxFilterMatcher>   pMatcher;
+    std::unique_ptr<SfxErrorHandler>    m_pToolsErrorHdl;
+    std::unique_ptr<SfxErrorHandler>    m_pSoErrorHdl;
 #if HAVE_FEATURE_SCRIPTING
-    SfxErrorHandler *m_pSbxErrorHdl;
+    std::unique_ptr<SfxErrorHandler>    m_pSbxErrorHdl;
 #endif
     rtl::Reference<SfxStatusDispatcher> mxAppDispatch;
     std::unique_ptr<SfxPickList>        mxAppPickList;
-    SfxDocumentTemplates*               pTemplates;
+    std::unique_ptr<SfxDocumentTemplates> pTemplates;
 
     // global pointers
     SfxItemPool*                        pPool;
@@ -96,18 +97,25 @@ public:
     sal_uInt16                              nDocModalMode;              // counts documents in modal mode
     sal_uInt16                              nRescheduleLocks;
 
-    SfxTbxCtrlFactArr_Impl*     pTbxCtrlFac;
-    SfxStbCtrlFactArr_Impl*     pStbCtrlFac;
-    SfxViewFrameArr_Impl*       pViewFrames;
-    SfxViewShellArr_Impl*       pViewShells;
-    SfxObjectShellArr_Impl*     pObjShells;
+    std::unique_ptr<SfxTbxCtrlFactArr_Impl>
+                                pTbxCtrlFac;
+    std::unique_ptr<SfxStbCtrlFactArr_Impl>
+                                pStbCtrlFac;
+    std::unique_ptr<SfxViewFrameArr_Impl>
+                                pViewFrames;
+    std::unique_ptr<SfxViewShellArr_Impl>
+                                pViewShells;
+    std::unique_ptr<SfxObjectShellArr_Impl>
+                                pObjShells;
     std::unique_ptr<SfxBasicManagerHolder>
                                 pBasicManager;
     std::unique_ptr<SfxBasicManagerCreationListener>
                                 pBasMgrListener;
     SfxViewFrame*               pViewFrame;
-    SfxSlotPool*                pSlotPool;
-    SfxDispatcher*              pAppDispat;     // Dispatcher if no document
+    std::unique_ptr<SfxSlotPool>
+                                pSlotPool;
+    std::unique_ptr<SfxDispatcher>
+                                pAppDispat;     // Dispatcher if no document
     ::rtl::Reference<sfx2::sidebar::Theme> m_pSidebarTheme;
 
     bool                        bDowning:1;   // sal_True on Exit and afterwards


More information about the Libreoffice-commits mailing list