From 736df7696fc3e995b3dbc8a7f0338f7c31b6dde4 Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Fri, 19 Jun 2020 18:25:59 -0400 Subject: [PATCH] FDO Secrets: Fix double free on exit * Prevent double free due to QObject cleanup happening before/after the ExtraPage storing the QSharedPointer to FdoSecretsPlugin is deleted. * Fixes #4877 --- src/fdosecrets/FdoSecretsPlugin.cpp | 12 ++++++++++-- src/fdosecrets/FdoSecretsPlugin.h | 3 +++ tests/gui/TestGuiFdoSecrets.cpp | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/fdosecrets/FdoSecretsPlugin.cpp b/src/fdosecrets/FdoSecretsPlugin.cpp index 9db35338..96d76e34 100644 --- a/src/fdosecrets/FdoSecretsPlugin.cpp +++ b/src/fdosecrets/FdoSecretsPlugin.cpp @@ -30,13 +30,21 @@ using FdoSecrets::Service; +// TODO: Only used for testing. Need to split service functions away from settings page. +QPointer g_fdoSecretsPlugin; + FdoSecretsPlugin::FdoSecretsPlugin(DatabaseTabWidget* tabWidget) - : QObject(tabWidget) - , m_dbTabs(tabWidget) + : m_dbTabs(tabWidget) { + g_fdoSecretsPlugin = this; FdoSecrets::registerDBusTypes(); } +FdoSecretsPlugin* FdoSecretsPlugin::getPlugin() +{ + return g_fdoSecretsPlugin; +} + QWidget* FdoSecretsPlugin::createWidget() { return new SettingsWidgetFdoSecrets(this); diff --git a/src/fdosecrets/FdoSecretsPlugin.h b/src/fdosecrets/FdoSecretsPlugin.h index 674c3c3b..d0008b80 100644 --- a/src/fdosecrets/FdoSecretsPlugin.h +++ b/src/fdosecrets/FdoSecretsPlugin.h @@ -70,6 +70,9 @@ public: */ QString reportExistingService() const; + // TODO: Only used for testing. Need to split service functions away from settings page. + static FdoSecretsPlugin* getPlugin(); + public slots: void emitRequestSwitchToDatabases(); void emitRequestShowNotification(const QString& msg, const QString& title = {}); diff --git a/tests/gui/TestGuiFdoSecrets.cpp b/tests/gui/TestGuiFdoSecrets.cpp index deccc26d..9dffa6ba 100644 --- a/tests/gui/TestGuiFdoSecrets.cpp +++ b/tests/gui/TestGuiFdoSecrets.cpp @@ -200,7 +200,7 @@ void TestGuiFdoSecrets::initTestCase() m_mainWindow.reset(new MainWindow()); m_tabWidget = m_mainWindow->findChild("tabWidget"); QVERIFY(m_tabWidget); - m_plugin = m_mainWindow->findChild(); + m_plugin = FdoSecretsPlugin::getPlugin(); QVERIFY(m_plugin); m_mainWindow->show();