From 81451de0e6f5f58247746ed17430a7b9514f20b9 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Wed, 26 Mar 2025 08:06:04 +0100 Subject: [PATCH] QDesktopUnixServices: don't leak the QDBusPendingCallWatcher When, like in tst_QApplication::qtbug_103611(), a QApplication object is destroyed without calling exec(), then QDesktopUnixServices leaked its QDBusPendingCallWatcher, because the connection to the slot that would deleteLater() the watcher was disconnected, and the watcher had no QObject parent that would otherwise reap it. Fix by actually deleting the watcher in ~QDesktopUnixServices(), if it still exists (which implies disconnecting, of course). This makes tst_QApplication asan-clean on Linux/X11 (was: "75466 bytes leaked in 965 allocations"). Amends de609d84b9cee4a481d1718c00b09105d8c2ae69. Pick-to: 6.8 6.5 Change-Id: I28a08abdb1be65a8746702ad304282de4e1100d7 Reviewed-by: Liang Qi Reviewed-by: Friedemann Kleint (cherry picked from commit 567da5e3e0070b7a0dd9ba1acbe9347c6cc1d0fe) Reviewed-by: Qt Cherry-pick Bot --- src/gui/platform/unix/qdesktopunixservices.cpp | 4 ++-- src/gui/platform/unix/qdesktopunixservices_p.h | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/gui/platform/unix/qdesktopunixservices.cpp b/src/gui/platform/unix/qdesktopunixservices.cpp index be472414ee5..a4fff9b11ca 100644 --- a/src/gui/platform/unix/qdesktopunixservices.cpp +++ b/src/gui/platform/unix/qdesktopunixservices.cpp @@ -397,7 +397,7 @@ QDesktopUnixServices::QDesktopUnixServices() QDBusPendingCall pendingCall = QDBusConnection::sessionBus().asyncCall(message); auto watcher = new QDBusPendingCallWatcher(pendingCall); - m_watcherConnection = + m_watcher = watcher; QObject::connect(watcher, &QDBusPendingCallWatcher::finished, watcher, [this](QDBusPendingCallWatcher *watcher) { watcher->deleteLater(); @@ -412,7 +412,7 @@ QDesktopUnixServices::QDesktopUnixServices() QDesktopUnixServices::~QDesktopUnixServices() { #if QT_CONFIG(dbus) - QObject::disconnect(m_watcherConnection); + delete m_watcher; #endif } diff --git a/src/gui/platform/unix/qdesktopunixservices_p.h b/src/gui/platform/unix/qdesktopunixservices_p.h index f52dc35bbe2..903bd6e6510 100644 --- a/src/gui/platform/unix/qdesktopunixservices_p.h +++ b/src/gui/platform/unix/qdesktopunixservices_p.h @@ -16,11 +16,14 @@ // #include + +#include #include #include QT_BEGIN_NAMESPACE +class QDBusPendingCallWatcher; class QWindow; class Q_GUI_EXPORT QDesktopUnixServices : public QPlatformServices @@ -46,7 +49,7 @@ private: QString m_webBrowser; QString m_documentLauncher; #if QT_CONFIG(dbus) - QMetaObject::Connection m_watcherConnection; + QPointer m_watcher = nullptr; #endif bool m_hasScreenshotPortalWithColorPicking = false; };