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
Change-Id: Ib71441a6b680d8633707cc02f9b6081c0f02472b
Reviewed-by: Dmitry Shachnev <mitya57@gmail.com>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
(cherry picked from commit 2ca19d2dd3137f2c29dcb2b1f2d23b23f3f1b0aa)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Jonas Kvinge 2021-06-16 00:45:53 +02:00 committed by Qt Cherry-pick Bot
parent 4d32382976
commit 52f93a88eb
2 changed files with 9 additions and 0 deletions

View File

@ -70,6 +70,7 @@ const QString MenuBarPath = QLatin1String("/MenuBar");
*/ */
QDBusMenuConnection::QDBusMenuConnection(QObject *parent, const QString &serviceName) QDBusMenuConnection::QDBusMenuConnection(QObject *parent, const QString &serviceName)
: QObject(parent) : QObject(parent)
, m_serviceName(serviceName)
, m_connection(serviceName.isNull() ? QDBusConnection::sessionBus() , m_connection(serviceName.isNull() ? QDBusConnection::sessionBus()
: QDBusConnection::connectToBus(QDBusConnection::SessionBus, serviceName)) : QDBusConnection::connectToBus(QDBusConnection::SessionBus, serviceName))
, m_dbusWatcher(new QDBusServiceWatcher(StatusNotifierWatcherService, m_connection, QDBusServiceWatcher::WatchForRegistration, this)) , m_dbusWatcher(new QDBusServiceWatcher(StatusNotifierWatcherService, m_connection, QDBusServiceWatcher::WatchForRegistration, this))
@ -84,6 +85,12 @@ QDBusMenuConnection::QDBusMenuConnection(QObject *parent, const QString &service
#endif #endif
} }
QDBusMenuConnection::~QDBusMenuConnection()
{
if (!m_serviceName.isEmpty() && m_connection.isConnected())
QDBusConnection::disconnectFromBus(m_serviceName);
}
void QDBusMenuConnection::dbusError(const QDBusError &error) void QDBusMenuConnection::dbusError(const QDBusError &error)
{ {
qWarning() << "QDBusTrayIcon encountered a D-Bus error:" << error; qWarning() << "QDBusTrayIcon encountered a D-Bus error:" << error;

View File

@ -71,6 +71,7 @@ class QDBusMenuConnection : public QObject
public: public:
QDBusMenuConnection(QObject *parent = nullptr, const QString &serviceName = QString()); QDBusMenuConnection(QObject *parent = nullptr, const QString &serviceName = QString());
~QDBusMenuConnection();
QDBusConnection connection() const { return m_connection; } QDBusConnection connection() const { return m_connection; }
QDBusServiceWatcher *dbusWatcher() const { return m_dbusWatcher; } QDBusServiceWatcher *dbusWatcher() const { return m_dbusWatcher; }
bool isStatusNotifierHostRegistered() const { return m_statusNotifierHostRegistered; } bool isStatusNotifierHostRegistered() const { return m_statusNotifierHostRegistered; }
@ -91,6 +92,7 @@ private Q_SLOTS:
void dbusError(const QDBusError &error); void dbusError(const QDBusError &error);
private: private:
QString m_serviceName;
QDBusConnection m_connection; QDBusConnection m_connection;
QDBusServiceWatcher *m_dbusWatcher; QDBusServiceWatcher *m_dbusWatcher;
bool m_statusNotifierHostRegistered; bool m_statusNotifierHostRegistered;