From c6d6d3c75e7e2c890f6aecb6a46b61cf9463b95d Mon Sep 17 00:00:00 2001 From: Tim Kosse Date: Thu, 3 Jul 2014 14:16:37 +0000 Subject: [PATCH] wxListTextCtrlWrapper::Finish and wxTreeTextCtrl::Finish cannot be called multiple times without crashing. wxListTextCtrlWrapper already used to protect against this in the past, but revision 51150 removed the safety check. This patch reimplements the functionality in a slighly different way for both controls, so that Finish is not called multiple times. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_3_0_BRANCH@76808 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/generic/listctrl.cpp | 8 ++++++++ src/generic/treectlg.cpp | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index f17dd0124f..bd5171face 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -1420,6 +1420,13 @@ wxListTextCtrlWrapper::wxListTextCtrlWrapper(wxListMainWindow *owner, void wxListTextCtrlWrapper::EndEdit(EndReason reason) { + if( m_aboutToFinish ) + { + // We already called Finish which cannot be called + // more than once. + return; + } + m_aboutToFinish = true; switch ( reason ) @@ -1525,6 +1532,7 @@ void wxListTextCtrlWrapper::OnKillFocus( wxFocusEvent &event ) { if ( !m_aboutToFinish ) { + m_aboutToFinish = true; if ( !AcceptChanges() ) m_owner->OnRenameCancelled( m_itemEdited ); diff --git a/src/generic/treectlg.cpp b/src/generic/treectlg.cpp index 4637767193..f163333bc1 100644 --- a/src/generic/treectlg.cpp +++ b/src/generic/treectlg.cpp @@ -458,6 +458,13 @@ wxTreeTextCtrl::wxTreeTextCtrl(wxGenericTreeCtrl *owner, void wxTreeTextCtrl::EndEdit(bool discardChanges) { + if ( m_aboutToFinish ) + { + // We already called Finish which cannot be called + // more than once. + return; + } + m_aboutToFinish = true; if ( discardChanges ) @@ -555,6 +562,7 @@ void wxTreeTextCtrl::OnKillFocus( wxFocusEvent &event ) { if ( !m_aboutToFinish ) { + m_aboutToFinish = true; if ( !AcceptChanges() ) m_owner->OnRenameCancelled( m_itemEdited );