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