[Libreoffice-commits] core.git: 2 commits - chart2/source dbaccess/source framework/source include/svtools sfx2/source svtools/source

Stephan Bergmann sbergman at redhat.com
Fri Dec 11 07:17:36 PST 2015


 chart2/source/controller/main/ChartController_Window.cxx |    2 +-
 dbaccess/source/ui/browser/dataview.cxx                  |    2 +-
 framework/source/uielement/menubarmanager.cxx            |   11 ++++++-----
 include/svtools/acceleratorexecute.hxx                   |    3 ++-
 sfx2/source/dialog/backingwindow.cxx                     |    2 +-
 sfx2/source/view/viewsh.cxx                              |    3 +--
 svtools/source/misc/acceleratorexecute.cxx               |    5 ++---
 7 files changed, 14 insertions(+), 14 deletions(-)

New commits:
commit 576c7562ecf3d6d707c78d80852907c4a014178f
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Fri Dec 11 16:15:53 2015 +0100

    Return std::unique_ptr from svt::AcceleratorExecute::createAcceleratorHelper
    
    ...to prevent errors like 5ac6e00274e732435b55c2908db9cea658fe549b "Memory leak"
    
    Change-Id: I3e20393af628849d8a387b491b75e1aacdea982a

diff --git a/chart2/source/controller/main/ChartController_Window.cxx b/chart2/source/controller/main/ChartController_Window.cxx
index 1b4dd62..eb438f8 100644
--- a/chart2/source/controller/main/ChartController_Window.cxx
+++ b/chart2/source/controller/main/ChartController_Window.cxx
@@ -1252,7 +1252,7 @@ bool ChartController::execute_KeyInput( const KeyEvent& rKEvt )
     // handle accelerators
     if( ! m_apAccelExecute.get() && m_xFrame.is() && m_xCC.is() )
     {
-        m_apAccelExecute.reset( ::svt::AcceleratorExecute::createAcceleratorHelper());
+        m_apAccelExecute = ::svt::AcceleratorExecute::createAcceleratorHelper();
         OSL_ASSERT( m_apAccelExecute.get());
         if( m_apAccelExecute.get() )
             m_apAccelExecute->init( m_xCC, m_xFrame );
diff --git a/dbaccess/source/ui/browser/dataview.cxx b/dbaccess/source/ui/browser/dataview.cxx
index a722433..7524665 100644
--- a/dbaccess/source/ui/browser/dataview.cxx
+++ b/dbaccess/source/ui/browser/dataview.cxx
@@ -47,7 +47,7 @@ namespace dbaui
         ,m_xController( &_rController )
         ,m_aSeparator( VclPtr<FixedLine>::Create(this) )
     {
-        m_pAccel.reset(::svt::AcceleratorExecute::createAcceleratorHelper());
+        m_pAccel = ::svt::AcceleratorExecute::createAcceleratorHelper();
         m_aSeparator->Show();
     }
 
diff --git a/include/svtools/acceleratorexecute.hxx b/include/svtools/acceleratorexecute.hxx
index 8736506..b2ec4a0 100644
--- a/include/svtools/acceleratorexecute.hxx
+++ b/include/svtools/acceleratorexecute.hxx
@@ -22,6 +22,7 @@
 
 #include <svtools/svtdllapi.h>
 
+#include <memory>
 #include <vector>
 
 #include <com/sun/star/uno/XComponentContext.hpp>
@@ -114,7 +115,7 @@ class SVT_DLLPUBLIC AcceleratorExecute : private TMutexInit
                          environment will be recognized ... The helper stop its
                          work immediately then!
          */
-        static AcceleratorExecute* createAcceleratorHelper();
+        static std::unique_ptr<AcceleratorExecute> createAcceleratorHelper();
 
 
         /** @short  fight against inlining ... */
diff --git a/sfx2/source/dialog/backingwindow.cxx b/sfx2/source/dialog/backingwindow.cxx
index bd36eb3..32e8851 100644
--- a/sfx2/source/dialog/backingwindow.cxx
+++ b/sfx2/source/dialog/backingwindow.cxx
@@ -442,7 +442,7 @@ bool BackingWindow::PreNotify( NotifyEvent& rNEvt )
         // try the 'normal' accelerators (so that eg. Ctrl+Q works)
         if (!mpAccExec)
         {
-            mpAccExec.reset(svt::AcceleratorExecute::createAcceleratorHelper());
+            mpAccExec = svt::AcceleratorExecute::createAcceleratorHelper();
             mpAccExec->init( comphelper::getProcessComponentContext(), mxFrame);
         }
 
diff --git a/sfx2/source/view/viewsh.cxx b/sfx2/source/view/viewsh.cxx
index e9af2f4..e4c14a2 100644
--- a/sfx2/source/view/viewsh.cxx
+++ b/sfx2/source/view/viewsh.cxx
@@ -1619,8 +1619,7 @@ bool SfxViewShell::ExecKey_Impl(const KeyEvent& aKey)
 {
     if (!pImp->m_xAccExec.get())
     {
-        pImp->m_xAccExec.reset(
-            ::svt::AcceleratorExecute::createAcceleratorHelper() );
+        pImp->m_xAccExec = ::svt::AcceleratorExecute::createAcceleratorHelper();
         pImp->m_xAccExec->init(::comphelper::getProcessComponentContext(),
             pFrame->GetFrame().GetFrameInterface());
     }
diff --git a/svtools/source/misc/acceleratorexecute.cxx b/svtools/source/misc/acceleratorexecute.cxx
index 83fa885..a34281b 100644
--- a/svtools/source/misc/acceleratorexecute.cxx
+++ b/svtools/source/misc/acceleratorexecute.cxx
@@ -93,10 +93,9 @@ AcceleratorExecute::~AcceleratorExecute()
 }
 
 
-AcceleratorExecute* AcceleratorExecute::createAcceleratorHelper()
+std::unique_ptr<AcceleratorExecute> AcceleratorExecute::createAcceleratorHelper()
 {
-    AcceleratorExecute* pNew = new AcceleratorExecute();
-    return pNew;
+    return std::unique_ptr<AcceleratorExecute>(new AcceleratorExecute);
 }
 
 
commit 1e0e115d47e5874414ab511de8671d5bc466812c
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Fri Dec 11 15:58:43 2015 +0100

    Clear all m_pVCLMenu->pItemList->maItemList[i]->m_pSubMenu
    
    ...even if no correpsonding xPopupMenu proxy has been set up for some i (because
    that sub-menu has never been opened by the user).  Otherwise, the Menu that
    m_pVCLMenu->pItemList->maItemList[i]->m_pSubMenu points to will be deleted
    (during a recursive xSubMenuManager->dispose call), and when later for some
    sub-menu j > i that /has/ been opened by the user SetPopupMenu is called, that
    can lead to
    
    > Menu::GetPopupMenu(unsigned short) const at vcl/source/window/menu.cxx:835
    > Menu::GetAccessible() at vcl/source/window/menu.cxx:1400
    > OAccessibleMenuItemComponent::getAccessibleParent() at accessibility/source/standard/accessiblemenuitemcomponent.cxx:339
    > non-virtual thunk to OAccessibleMenuItemComponent::getAccessibleParent() at accessibility/source/standard/accessiblemenuitemcomponent.cxx:335
    > atk_object_wrapper_new(com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessible> const&, AtkObject*) at vcl/unx/gtk3/a11y/../../gtk/a11y/atkwrapper.cxx:839
    > atk_object_wrapper_ref(com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessible> const&, bool) at vcl/unx/gtk3/a11y/../../gtk/a11y/atkwrapper.cxx:795
    > AtkListener::handleChildAdded(com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessibleContext> const&, com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessible> const&) at vcl/unx/gtk3/a11y/../../gtk/a11y/atklistener.cxx:157
    > AtkListener::notifyEvent(com::sun::star::accessibility::AccessibleEventObject const&) at vcl/unx/gtk3/a11y/../../gtk/a11y/atklistener.cxx:296
    > comphelper::AccessibleEventNotifier::addEvent(unsigned int, com::sun::star::accessibility::AccessibleEventObject const&) at comphelper/source/misc/accessibleeventnotifier.cxx:281
    > comphelper::OAccessibleContextHelper::NotifyAccessibleEvent(short, com::sun::star::uno::Any const&, com::sun::star::uno::Any const&) at comphelper/source/misc/accessiblecontexthelper.cxx:188
    > OAccessibleMenuBaseComponent::InsertChild(int) at accessibility/source/standard/accessiblemenubasecomponent.cxx:436
    > OAccessibleMenuBaseComponent::ProcessMenuEvent(VclMenuEvent const&) at accessibility/source/standard/accessiblemenubasecomponent.cxx:624
    > OAccessibleMenuBaseComponent::MenuEventListener(VclMenuEvent&) at accessibility/source/standard/accessiblemenubasecomponent.cxx:572
    > OAccessibleMenuBaseComponent::LinkStubMenuEventListener(void*, VclMenuEvent&) at accessibility/source/standard/accessiblemenubasecomponent.cxx:569
    > Link<VclMenuEvent&, void>::Call(VclMenuEvent&) const at include/tools/link.hxx:84
    > Menu::ImplCallEventListeners(unsigned long, unsigned short) at vcl/source/window/menu.cxx:355
    > Menu::SetPopupMenu(unsigned short, PopupMenu*) at vcl/source/window/menu.cxx:825
    > framework::MenuBarManager::RemoveListener() at framework/source/uielement/menubarmanager.cxx:556
    
    looking at the dangling pSubMenu pointer (and even if the dangling pointer is
    never dereferenced, UBSan will try to determine whether the static_cast in
    
      return static_cast<PopupMenu*>(pData->pSubMenu);
    
    in Menu::GetPopupMenu, vcl/source/window/menu.cxx, is fine and cause a crash).
    
    Change-Id: I5e5f6dba266580e3c2e7693877ea79a07d80bb74

diff --git a/framework/source/uielement/menubarmanager.cxx b/framework/source/uielement/menubarmanager.cxx
index 6f691c7..1377370 100644
--- a/framework/source/uielement/menubarmanager.cxx
+++ b/framework/source/uielement/menubarmanager.cxx
@@ -549,13 +549,14 @@ void MenuBarManager::RemoveListener()
             }
 
             pItemHandler->xMenuItemDispatch.clear();
+
+            // Remove popup menu from menu structure (regardless whether an
+            // xPopupMenu proxy has been set up for it; calling SetPopupMenu for
+            // a non-popup child will effectively do nothing:
+            m_pVCLMenu->SetPopupMenu( pItemHandler->nItemId, nullptr );
+
             if ( pItemHandler->xPopupMenu.is() )
             {
-                {
-                    // Remove popup menu from menu structure
-                    m_pVCLMenu->SetPopupMenu( pItemHandler->nItemId, nullptr );
-                }
-
                 Reference< css::lang::XEventListener > xEventListener( pItemHandler->xPopupMenuController, UNO_QUERY );
                 if ( xEventListener.is() )
                 {


More information about the Libreoffice-commits mailing list