[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