From 9f009d128f0abbed4e6ff273a7a535a746698eab Mon Sep 17 00:00:00 2001 From: Mariano Reingart Date: Wed, 24 Dec 2014 19:19:27 +0000 Subject: [PATCH] Fix SIGSEGV due bad pointer in wxMessageDialog (wxQT) m_qtWindow should be used instead of m_qtMessageBox (removed). If not, PostCreation() cannot call wxMessageDialog::GetHandle() as it is virtual (and it is called from the ctor), so it fails to set the base window pointer, raising a SIGSEGV in wxWindow::DoSetSize (for more info, see architecture in docs) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@78312 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/qt/msgdlg.h | 2 -- src/qt/msgdlg.cpp | 42 +++++++++++++++++++++--------------------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/include/wx/qt/msgdlg.h b/include/wx/qt/msgdlg.h index fb57e2088e..447dd60522 100644 --- a/include/wx/qt/msgdlg.h +++ b/include/wx/qt/msgdlg.h @@ -26,8 +26,6 @@ public: virtual QMessageBox *GetHandle() const; -private: - QMessageBox *m_qtMessageBox; }; #endif // _WX_QT_MSGDLG_H_ diff --git a/src/qt/msgdlg.cpp b/src/qt/msgdlg.cpp index 8c96127e00..7b57eb9e5b 100644 --- a/src/qt/msgdlg.cpp +++ b/src/qt/msgdlg.cpp @@ -27,39 +27,39 @@ wxMessageDialog::wxMessageDialog( wxWindow *parent, const wxString& message, const wxString& caption, long style, const wxPoint& pos ) : wxMessageDialogBase( parent, message, caption, style ) { - m_qtMessageBox = new wxQtMessageDialog( parent, this ); + m_qtWindow = new wxQtMessageDialog( parent, this ); // Set properties Move( pos ); - m_qtMessageBox->setText( wxQtConvertString( message ) ); - m_qtMessageBox->setWindowTitle( wxQtConvertString( caption ) ); + GetHandle()->setText( wxQtConvertString( message ) ); + GetHandle()->setWindowTitle( wxQtConvertString( caption ) ); // Apply the style SetWindowStyleFlag( style ); // Buttons if ( style & wxOK ) - m_qtMessageBox->addButton( QMessageBox::Ok ); + GetHandle()->addButton( QMessageBox::Ok ); if ( style & wxCANCEL ) - m_qtMessageBox->addButton( QMessageBox::Cancel ); + GetHandle()->addButton( QMessageBox::Cancel ); if ( style & wxYES_NO ) { - m_qtMessageBox->addButton( QMessageBox::Yes ); - m_qtMessageBox->addButton( QMessageBox::No ); + GetHandle()->addButton( QMessageBox::Yes ); + GetHandle()->addButton( QMessageBox::No ); } // Default button if ( style & wxNO_DEFAULT ) - m_qtMessageBox->setDefaultButton( QMessageBox::No ); + GetHandle()->setDefaultButton( QMessageBox::No ); else if ( style & wxCANCEL_DEFAULT ) - m_qtMessageBox->setDefaultButton( QMessageBox::Cancel ); + GetHandle()->setDefaultButton( QMessageBox::Cancel ); else { // Default to OK or Yes if ( style & wxOK ) - m_qtMessageBox->setDefaultButton( QMessageBox::Ok ); + GetHandle()->setDefaultButton( QMessageBox::Ok ); else - m_qtMessageBox->setDefaultButton( QMessageBox::Yes ); + GetHandle()->setDefaultButton( QMessageBox::Yes ); } // Icon @@ -67,31 +67,31 @@ wxMessageDialog::wxMessageDialog( wxWindow *parent, const wxString& message, if ( style & wxICON_NONE ) { numIcons++; - m_qtMessageBox->setIcon( QMessageBox::NoIcon ); + GetHandle()->setIcon( QMessageBox::NoIcon ); } if ( style & wxICON_EXCLAMATION ) { numIcons++; - m_qtMessageBox->setIcon( QMessageBox::Warning ); + GetHandle()->setIcon( QMessageBox::Warning ); } if ( style & wxICON_ERROR || style & wxICON_HAND ) { numIcons++; - m_qtMessageBox->setIcon( QMessageBox::Critical ); + GetHandle()->setIcon( QMessageBox::Critical ); } if ( style & wxICON_QUESTION ) { numIcons++; - m_qtMessageBox->setIcon( QMessageBox::Question ); + GetHandle()->setIcon( QMessageBox::Question ); } if ( style & wxICON_INFORMATION ) { numIcons++; - m_qtMessageBox->setIcon( QMessageBox::Information ); + GetHandle()->setIcon( QMessageBox::Information ); } wxCHECK_RET( numIcons <= 1, "Multiple icon definitions" ); @@ -99,20 +99,20 @@ wxMessageDialog::wxMessageDialog( wxWindow *parent, const wxString& message, { // Use default if ( style & wxYES_NO ) - m_qtMessageBox->setIcon( QMessageBox::Question ); + GetHandle()->setIcon( QMessageBox::Question ); else - m_qtMessageBox->setIcon( QMessageBox::Information ); + GetHandle()->setIcon( QMessageBox::Information ); } if ( style & wxSTAY_ON_TOP ) - m_qtMessageBox->setWindowModality( Qt::ApplicationModal ); + GetHandle()->setWindowModality( Qt::ApplicationModal ); PostCreation(); } int wxMessageDialog::ShowModal() { - wxCHECK_MSG( m_qtMessageBox, -1, "Invalid dialog" ); + wxCHECK_MSG( GetHandle(), -1, "Invalid dialog" ); // Exec may return a wx identifier if a close event is generated int ret = GetHandle()->exec(); @@ -134,7 +134,7 @@ int wxMessageDialog::ShowModal() QMessageBox *wxMessageDialog::GetHandle() const { - return m_qtMessageBox; + return static_cast(m_qtWindow); } wxMessageDialog::~wxMessageDialog()