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 <sberg...@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 <sberg...@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() )
                 {
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to