summaryrefslogtreecommitdiffstats
path: root/src/plugins/platformthemes
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@theqtcompany.com>2016-01-04 17:28:51 +0100
committerJoerg Bornemann <joerg.bornemann@theqtcompany.com>2016-01-05 16:09:22 +0000
commit6d6707c8c390216ac2f69b5771d14ee9141b19d2 (patch)
tree40198914ba6356ccbd40676438ca29d2d60bde47 /src/plugins/platformthemes
parenta1702da020906e1fb5b293257d87209f1795809b (diff)
Fix access after delete in GTK2 dialog helpers
Each QGtk2*DialogHelper class owns a QGtk2Dialog. It is possible that QGtk2Dialog's parent window is destroyed before QGtk2*DialogHelper. Then the QGtk2Dialog is destroyed, because of the QWindow parent/child relationship. Before destroying QGtk2*DialogHelper, QQuickPlatformFileDialog calls QGtk2*DialogHelper::hide, which will then operate on the already destroyed QGtk2Dialog. Break the parent/child relationship when QGtk2Dialog's parent is destroyed. Change-Id: Ie2bda234f759e7bf4d0642accd82fdc38e0379c2 Task-number: QTBUG-49203 Reviewed-by: J-P Nurmi <jpnurmi@theqtcompany.com>
Diffstat (limited to 'src/plugins/platformthemes')
-rw-r--r--src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp b/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp
index 2f0bceafe6..857f373759 100644
--- a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp
+++ b/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp
@@ -71,6 +71,9 @@ Q_SIGNALS:
protected:
static void onResponse(QGtk2Dialog *dialog, int response);
+private slots:
+ void onParentWindowDestroyed();
+
private:
GtkWidget *gtkWidget;
};
@@ -108,6 +111,8 @@ void QGtk2Dialog::exec()
bool QGtk2Dialog::show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent)
{
+ connect(parent, &QWindow::destroyed, this, &QGtk2Dialog::onParentWindowDestroyed,
+ Qt::UniqueConnection);
setParent(parent);
setFlags(flags);
setModality(modality);
@@ -144,6 +149,12 @@ void QGtk2Dialog::onResponse(QGtk2Dialog *dialog, int response)
emit dialog->reject();
}
+void QGtk2Dialog::onParentWindowDestroyed()
+{
+ // The QGtk2*DialogHelper classes own this object. Make sure the parent doesn't delete it.
+ setParent(0);
+}
+
QGtk2ColorDialogHelper::QGtk2ColorDialogHelper()
{
d.reset(new QGtk2Dialog(gtk_color_selection_dialog_new("")));