From 5f8f8b2e62d5d7969e986124694ec0b942c580dc Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Fri, 25 Nov 2022 11:17:02 +0100 Subject: [PATCH] Fix a crash when the same plugin file is loaded twice If the same directory is passed twice QPluginLoader would return the same object for the instance() call. Deleting that would lead to deleting the instance for the originally loaded plugin too. --- libnymea-core/integrations/thingmanagerimplementation.cpp | 6 +++++- tests/testlib/nymeatestbase.cpp | 8 ++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/libnymea-core/integrations/thingmanagerimplementation.cpp b/libnymea-core/integrations/thingmanagerimplementation.cpp index b00c373a..bb8d29a2 100644 --- a/libnymea-core/integrations/thingmanagerimplementation.cpp +++ b/libnymea-core/integrations/thingmanagerimplementation.cpp @@ -1426,7 +1426,11 @@ void ThingManagerImplementation::loadPlugins() if (m_integrationPlugins.contains(plugin->pluginId())) { qCWarning(dcThingManager()) << "A plugin with this ID is already loaded. Not loading" << entry << plugin->pluginId(); - delete plugin; + // Depending on the plugin type, duplicate loading of the same plugin file may return the same instance. In which + // case we do *not* want to delete it, but we want to delete the dupe if a new instance has been created with the same ID. + if (m_integrationPlugins.value(plugin->pluginId()) != plugin) { + delete plugin; + } continue; } loadPlugin(plugin); diff --git a/tests/testlib/nymeatestbase.cpp b/tests/testlib/nymeatestbase.cpp index ef509cce..ebbd8acf 100644 --- a/tests/testlib/nymeatestbase.cpp +++ b/tests/testlib/nymeatestbase.cpp @@ -220,7 +220,7 @@ QVariantList NymeaTestBase::checkNotifications(const QSignalSpy &spy, const QStr QVariant NymeaTestBase::getAndWait(const QNetworkRequest &request, const int &expectedStatus) { QNetworkAccessManager nam; - connect(&nam, &QNetworkAccessManager::sslErrors, [&nam](QNetworkReply *reply, const QList &) { + connect(&nam, &QNetworkAccessManager::sslErrors, [](QNetworkReply *reply, const QList &) { reply->ignoreSslErrors(); }); QSignalSpy clientSpy(&nam, SIGNAL(finished(QNetworkReply*))); @@ -258,7 +258,7 @@ QVariant NymeaTestBase::getAndWait(const QNetworkRequest &request, const int &ex QVariant NymeaTestBase::deleteAndWait(const QNetworkRequest &request, const int &expectedStatus) { QNetworkAccessManager nam; - connect(&nam, &QNetworkAccessManager::sslErrors, [this, &nam](QNetworkReply *reply, const QList &) { + connect(&nam, &QNetworkAccessManager::sslErrors, [](QNetworkReply *reply, const QList &) { reply->ignoreSslErrors(); }); QSignalSpy clientSpy(&nam, SIGNAL(finished(QNetworkReply*))); @@ -293,7 +293,7 @@ QVariant NymeaTestBase::deleteAndWait(const QNetworkRequest &request, const int QVariant NymeaTestBase::postAndWait(const QNetworkRequest &request, const QVariant ¶ms, const int &expectedStatus) { QNetworkAccessManager nam; - connect(&nam, &QNetworkAccessManager::sslErrors, [this, &nam](QNetworkReply *reply, const QList &) { + connect(&nam, &QNetworkAccessManager::sslErrors, [](QNetworkReply *reply, const QList &) { reply->ignoreSslErrors(); }); QSignalSpy clientSpy(&nam, SIGNAL(finished(QNetworkReply*))); @@ -333,7 +333,7 @@ QVariant NymeaTestBase::postAndWait(const QNetworkRequest &request, const QVaria QVariant NymeaTestBase::putAndWait(const QNetworkRequest &request, const QVariant ¶ms, const int &expectedStatus) { QNetworkAccessManager nam; - connect(&nam, &QNetworkAccessManager::sslErrors, [this, &nam](QNetworkReply *reply, const QList &) { + connect(&nam, &QNetworkAccessManager::sslErrors, [](QNetworkReply *reply, const QList &) { reply->ignoreSslErrors(); }); QSignalSpy clientSpy(&nam, SIGNAL(finished(QNetworkReply*)));