From 67f466505e1aed6b7f87e766141d081146b4159c Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 31 May 2016 17:33:03 -0300 Subject: Fix some QtDBus crashes during application destruction MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It's possible that some code executes after QDBusConnectionManager is destroyed and still tries to access QtDBus. Protect against such crashes. Change-Id: I87e17314d8b24ae983b1fffd1453c13fbd3cf48e Reviewed-by: René J.V. Bertin Reviewed-by: Alex Blasche Reviewed-by: Oswald Buddenhagen --- src/dbus/qdbusconnection.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'src/dbus/qdbusconnection.cpp') diff --git a/src/dbus/qdbusconnection.cpp b/src/dbus/qdbusconnection.cpp index c869707d6d..8fae11c8cd 100644 --- a/src/dbus/qdbusconnection.cpp +++ b/src/dbus/qdbusconnection.cpp @@ -426,7 +426,7 @@ void QDBusConnectionManager::createServer(const QString &address, void *server) */ QDBusConnection::QDBusConnection(const QString &name) { - if (name.isEmpty()) { + if (name.isEmpty() || _q_manager.isDestroyed()) { d = 0; } else { QMutexLocker locker(&_q_manager()->mutex); @@ -491,7 +491,7 @@ QDBusConnection &QDBusConnection::operator=(const QDBusConnection &other) */ QDBusConnection QDBusConnection::connectToBus(BusType type, const QString &name) { - if (!qdbus_loadLibDBus()) { + if (_q_manager.isDestroyed() || !qdbus_loadLibDBus()) { QDBusConnectionPrivate *d = 0; return QDBusConnection(d); } @@ -505,7 +505,7 @@ QDBusConnection QDBusConnection::connectToBus(BusType type, const QString &name) QDBusConnection QDBusConnection::connectToBus(const QString &address, const QString &name) { - if (!qdbus_loadLibDBus()) { + if (_q_manager.isDestroyed() || !qdbus_loadLibDBus()) { QDBusConnectionPrivate *d = 0; return QDBusConnection(d); } @@ -520,7 +520,7 @@ QDBusConnection QDBusConnection::connectToBus(const QString &address, QDBusConnection QDBusConnection::connectToPeer(const QString &address, const QString &name) { - if (!qdbus_loadLibDBus()) { + if (_q_manager.isDestroyed() || !qdbus_loadLibDBus()) { QDBusConnectionPrivate *d = 0; return QDBusConnection(d); } @@ -1175,6 +1175,8 @@ bool QDBusConnection::unregisterService(const QString &serviceName) */ QDBusConnection QDBusConnection::sessionBus() { + if (_q_manager.isDestroyed()) + return QDBusConnection(Q_NULLPTR); return QDBusConnection(_q_manager()->busConnection(SessionBus)); } @@ -1187,6 +1189,8 @@ QDBusConnection QDBusConnection::sessionBus() */ QDBusConnection QDBusConnection::systemBus() { + if (_q_manager.isDestroyed()) + return QDBusConnection(Q_NULLPTR); return QDBusConnection(_q_manager()->busConnection(SystemBus)); } -- cgit v1.2.3