From ff2c77ad7332a071ca8190ea373a4292fa312b24 Mon Sep 17 00:00:00 2001 From: Robert Griebl Date: Tue, 8 Mar 2022 18:44:11 +0100 Subject: Fix memory leaks introduced by adding the PackageInfo mechanism Found by the Linux/gcc/ASAN leak checker. Change-Id: I3c85515b994ad21b8718349baa81f9fc52a20615 Reviewed-by: Bernd Weimer (cherry picked from commit 969864e00491d262cdaf167a8d72ea5b0538bc7d) Reviewed-by: Robert Griebl --- src/intent-server-lib/intentserver.cpp | 2 ++ src/launcher-lib/applicationmanagerwindow.cpp | 5 +++-- src/launcher-lib/launchermain.cpp | 4 ++-- src/launcher-lib/launchermain.h | 4 +++- src/main-lib/main.h | 2 +- src/manager-lib/applicationmodel.cpp | 5 +++++ src/manager-lib/applicationmodel.h | 1 + src/manager-lib/packagemanager.cpp | 9 +++++++++ src/shared-main-lib/sharedmain.cpp | 2 ++ src/window-lib/waylandcompositor.cpp | 12 ++++++++++++ src/window-lib/waylandcompositor.h | 2 ++ 11 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/intent-server-lib/intentserver.cpp b/src/intent-server-lib/intentserver.cpp index 0aa518ff..480497b5 100644 --- a/src/intent-server-lib/intentserver.cpp +++ b/src/intent-server-lib/intentserver.cpp @@ -291,6 +291,8 @@ void IntentServer::removeIntent(Intent *intent) endRemoveRows(); emit countChanged(); + + delete intent; } } diff --git a/src/launcher-lib/applicationmanagerwindow.cpp b/src/launcher-lib/applicationmanagerwindow.cpp index daba3bed..d124ed9e 100644 --- a/src/launcher-lib/applicationmanagerwindow.cpp +++ b/src/launcher-lib/applicationmanagerwindow.cpp @@ -54,7 +54,7 @@ QT_BEGIN_NAMESPACE_AM class ApplicationManagerWindowPrivate { public: - LauncherMain *launcherMain = nullptr; + QPointer launcherMain = nullptr; }; @@ -137,7 +137,8 @@ ApplicationManagerWindow::ApplicationManagerWindow(QWindow *parent) ApplicationManagerWindow::~ApplicationManagerWindow() { - d->launcherMain->clearWindowPropertyCache(this); + if (d->launcherMain) + d->launcherMain->clearWindowPropertyCache(this); delete d; } diff --git a/src/launcher-lib/launchermain.cpp b/src/launcher-lib/launchermain.cpp index b154392b..037ea14d 100644 --- a/src/launcher-lib/launchermain.cpp +++ b/src/launcher-lib/launchermain.cpp @@ -79,8 +79,8 @@ LauncherMain *LauncherMain::instance() void LauncherMain::registerWaylandExtensions() Q_DECL_NOEXCEPT { #if !defined(AM_HEADLESS) && defined(QT_WAYLANDCLIENT_LIB) - m_waylandExtension = new WaylandQtAMClientExtension(); - connect(m_waylandExtension, &WaylandQtAMClientExtension::windowPropertyChanged, + m_waylandExtension.reset(new WaylandQtAMClientExtension()); + connect(m_waylandExtension.get(), &WaylandQtAMClientExtension::windowPropertyChanged, this, &LauncherMain::windowPropertyChanged); #endif } diff --git a/src/launcher-lib/launchermain.h b/src/launcher-lib/launchermain.h index 8a9d8e00..e526d5bf 100644 --- a/src/launcher-lib/launchermain.h +++ b/src/launcher-lib/launchermain.h @@ -112,7 +112,9 @@ private: QStringList m_iconThemeSearchPaths; QVariant m_useAMConsoleLogger; QString m_dltLongMessageBehavior; - WaylandQtAMClientExtension *m_waylandExtension = nullptr; +#if defined(QT_WAYLANDCLIENT_LIB) + QScopedPointer m_waylandExtension; +#endif }; QT_END_NAMESPACE_AM diff --git a/src/main-lib/main.h b/src/main-lib/main.h index c3080049..082187a8 100644 --- a/src/main-lib/main.h +++ b/src/main-lib/main.h @@ -92,7 +92,7 @@ class Main : public MainBase, protected SharedMain public: Main(int &argc, char **argv); - ~Main(); + ~Main() override; bool isSingleProcessMode() const; bool isRunningOnEmbedded() const; diff --git a/src/manager-lib/applicationmodel.cpp b/src/manager-lib/applicationmodel.cpp index cddba99f..55cf9bd8 100644 --- a/src/manager-lib/applicationmodel.cpp +++ b/src/manager-lib/applicationmodel.cpp @@ -161,6 +161,11 @@ ApplicationModel::ApplicationModel(QObject *parent) connect(this, &QAbstractItemModel::modelReset, this, &ApplicationModel::countChanged); } +ApplicationModel::~ApplicationModel() +{ + delete d; +} + int ApplicationModel::count() const { return rowCount(); diff --git a/src/manager-lib/applicationmodel.h b/src/manager-lib/applicationmodel.h index 6d0ef279..24bd4dbe 100644 --- a/src/manager-lib/applicationmodel.h +++ b/src/manager-lib/applicationmodel.h @@ -65,6 +65,7 @@ class ApplicationModel : public QSortFilterProxyModel public: ApplicationModel(QObject *parent = nullptr); + ~ApplicationModel() override; int count() const; diff --git a/src/manager-lib/packagemanager.cpp b/src/manager-lib/packagemanager.cpp index 8dd33c20..301bf80b 100644 --- a/src/manager-lib/packagemanager.cpp +++ b/src/manager-lib/packagemanager.cpp @@ -1491,6 +1491,7 @@ bool PackageManager::canceledPackageInstall(const QString &id) return false; case Package::BeingInstalled: { + // remove the package from the model int row = d->packages.indexOf(package); if (row >= 0) { emit packageAboutToBeRemoved(package->id()); @@ -1498,13 +1499,21 @@ bool PackageManager::canceledPackageInstall(const QString &id) d->packages.removeAt(row); endRemoveRows(); } + + // cleanup package->unblock(); + + // it's not yet added to the package db, so we need to delete ourselves + delete package->info(); + delete package; break; } case Package::BeingUpdated: case Package::BeingDowngraded: case Package::BeingRemoved: + delete d->pendingPackageInfoUpdates.take(package); + package->setState(Package::Installed); package->setProgress(0); emitDataChanged(package, QVector { IsUpdating }); diff --git a/src/shared-main-lib/sharedmain.cpp b/src/shared-main-lib/sharedmain.cpp index 7c41206a..31986783 100644 --- a/src/shared-main-lib/sharedmain.cpp +++ b/src/shared-main-lib/sharedmain.cpp @@ -262,6 +262,8 @@ void SharedMain::setupOpenGL(const QVariantMap &openGLConfiguration) // check if we got what we requested on the OpenGL side checkOpenGLFormat("global shared context", globalContext->format()); + + qAddPostRoutine([]() { delete qt_gl_global_share_context(); }); #endif } diff --git a/src/window-lib/waylandcompositor.cpp b/src/window-lib/waylandcompositor.cpp index 569d0a38..4bc81bb0 100644 --- a/src/window-lib/waylandcompositor.cpp +++ b/src/window-lib/waylandcompositor.cpp @@ -165,6 +165,11 @@ WaylandCompositor::WaylandCompositor(QQuickWindow *window, const QString &waylan , m_amExtension(new WaylandQtAMServerExtension(this)) , m_textInputManager(new QWaylandTextInputManager(this)) { + m_wlShell->setParent(this); + m_xdgShell->setParent(this); + m_amExtension->setParent(this); + m_textInputManager->setParent(this); + setSocketName(waylandSocketName.toUtf8()); registerOutputWindow(window); @@ -189,6 +194,13 @@ WaylandCompositor::WaylandCompositor(QQuickWindow *window, const QString &waylan defaultSeat()->keymap()->setLayout(QLocale::system().name().section(qL1C('_'), 1, 1).toLower()); } +WaylandCompositor::~WaylandCompositor() +{ + // QWayland leaks like sieve everywhere, but we need this explicit delete to be able + // to suppress the rest via LSAN leak suppression files + delete defaultSeat(); +} + void WaylandCompositor::xdgPing(WindowSurface* surface) { uint serial = m_xdgShell->ping(surface->client()); diff --git a/src/window-lib/waylandcompositor.h b/src/window-lib/waylandcompositor.h index c3398437..5264f152 100644 --- a/src/window-lib/waylandcompositor.h +++ b/src/window-lib/waylandcompositor.h @@ -128,6 +128,8 @@ class WaylandCompositor : public QWaylandQuickCompositor // clazy:exclude=missin Q_OBJECT public: WaylandCompositor(QQuickWindow* window, const QString &waylandSocketName); + ~WaylandCompositor() override; + void registerOutputWindow(QQuickWindow *window); WaylandQtAMServerExtension *amExtension(); -- cgit v1.2.1