summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
authorJonas Kvinge <jonas@jkvinge.net>2021-06-16 00:45:53 +0200
committerShawn Rutledge <shawn.rutledge@qt.io>2021-06-30 15:04:34 +0000
commit2ca19d2dd3137f2c29dcb2b1f2d23b23f3f1b0aa (patch)
tree66245653db9f0b5f322b88b85255ccdf9070a1f7 /src/gui
parent87249cd8b0fabd9b48226e3467a1b76a6276825e (diff)
QDBusMenuConnection: Close open D-Bus connection
Using QSystemTrayIcon::isSystemTrayAvailable() generates a new connection from QDBusTrayIcon::isSystemTrayAvailable() with a new unique instance ID. These were never closed, so calling QSystemTrayIcon::isSystemTrayAvailable() frequently leads to crash when it runs out of file descriptors. Fixes: QTBUG-94839 Pick-to: 5.15 6.1 6.2 Change-Id: Ib71441a6b680d8633707cc02f9b6081c0f02472b Reviewed-by: Dmitry Shachnev <mitya57@gmail.com> Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/platform/unix/dbusmenu/qdbusmenuconnection.cpp7
-rw-r--r--src/gui/platform/unix/dbusmenu/qdbusmenuconnection_p.h2
2 files changed, 9 insertions, 0 deletions
diff --git a/src/gui/platform/unix/dbusmenu/qdbusmenuconnection.cpp b/src/gui/platform/unix/dbusmenu/qdbusmenuconnection.cpp
index d6eb8c255c..ce95ee96b4 100644
--- a/src/gui/platform/unix/dbusmenu/qdbusmenuconnection.cpp
+++ b/src/gui/platform/unix/dbusmenu/qdbusmenuconnection.cpp
@@ -70,6 +70,7 @@ const QString MenuBarPath = QLatin1String("/MenuBar");
*/
QDBusMenuConnection::QDBusMenuConnection(QObject *parent, const QString &serviceName)
: QObject(parent)
+ , m_serviceName(serviceName)
, m_connection(serviceName.isNull() ? QDBusConnection::sessionBus()
: QDBusConnection::connectToBus(QDBusConnection::SessionBus, serviceName))
, m_dbusWatcher(new QDBusServiceWatcher(StatusNotifierWatcherService, m_connection, QDBusServiceWatcher::WatchForRegistration, this))
@@ -84,6 +85,12 @@ QDBusMenuConnection::QDBusMenuConnection(QObject *parent, const QString &service
#endif
}
+QDBusMenuConnection::~QDBusMenuConnection()
+{
+ if (!m_serviceName.isEmpty() && m_connection.isConnected())
+ QDBusConnection::disconnectFromBus(m_serviceName);
+}
+
void QDBusMenuConnection::dbusError(const QDBusError &error)
{
qWarning() << "QDBusTrayIcon encountered a D-Bus error:" << error;
diff --git a/src/gui/platform/unix/dbusmenu/qdbusmenuconnection_p.h b/src/gui/platform/unix/dbusmenu/qdbusmenuconnection_p.h
index 37183b021d..012f83fe0e 100644
--- a/src/gui/platform/unix/dbusmenu/qdbusmenuconnection_p.h
+++ b/src/gui/platform/unix/dbusmenu/qdbusmenuconnection_p.h
@@ -71,6 +71,7 @@ class QDBusMenuConnection : public QObject
public:
QDBusMenuConnection(QObject *parent = nullptr, const QString &serviceName = QString());
+ ~QDBusMenuConnection();
QDBusConnection connection() const { return m_connection; }
QDBusServiceWatcher *dbusWatcher() const { return m_dbusWatcher; }
bool isStatusNotifierHostRegistered() const { return m_statusNotifierHostRegistered; }
@@ -91,6 +92,7 @@ private Q_SLOTS:
void dbusError(const QDBusError &error);
private:
+ QString m_serviceName;
QDBusConnection m_connection;
QDBusServiceWatcher *m_dbusWatcher;
bool m_statusNotifierHostRegistered;