Rex Dieter 8ea9003
From 72700167cf051e5053f03bf4f4be391cd7514502 Mon Sep 17 00:00:00 2001
Rex Dieter 8ea9003
From: Thiago Macieira <thiago.macieira@intel.com>
Rex Dieter 8ea9003
Date: Tue, 31 May 2016 17:33:03 -0300
Rex Dieter 8ea9003
Subject: [PATCH 2/2] Fix some QtDBus crashes during application destruction
Rex Dieter 8ea9003
Rex Dieter 8ea9003
It's possible that some code executes after QDBusConnectionManager is
Rex Dieter 8ea9003
destroyed and still tries to access QtDBus. Protect against such
Rex Dieter 8ea9003
crashes.
Rex Dieter 8ea9003
Rex Dieter 8ea9003
Change-Id: I87e17314d8b24ae983b1fffd1453c13fbd3cf48e
Rex Dieter 8ea9003
---
Rex Dieter 8ea9003
 src/dbus/qdbusconnection.cpp | 12 ++++++++----
Rex Dieter 8ea9003
 src/dbus/qdbusintegrator.cpp |  3 +++
Rex Dieter 8ea9003
 src/dbus/qdbusserver.cpp     | 12 ++++++++++--
Rex Dieter 8ea9003
 3 files changed, 21 insertions(+), 6 deletions(-)
Rex Dieter 8ea9003
Rex Dieter 8ea9003
diff --git a/src/dbus/qdbusconnection.cpp b/src/dbus/qdbusconnection.cpp
Rex Dieter 8ea9003
index 4187f19..aa14ac2 100644
Rex Dieter 8ea9003
--- a/src/dbus/qdbusconnection.cpp
Rex Dieter 8ea9003
+++ b/src/dbus/qdbusconnection.cpp
Rex Dieter 8ea9003
@@ -418,7 +418,7 @@ void QDBusConnectionManager::createServer(const QString &address, void *server)
Rex Dieter 8ea9003
 */
Rex Dieter 8ea9003
 QDBusConnection::QDBusConnection(const QString &name)
Rex Dieter 8ea9003
 {
Rex Dieter 8ea9003
-    if (name.isEmpty()) {
Rex Dieter 8ea9003
+    if (name.isEmpty() || _q_manager.isDestroyed()) {
Rex Dieter 8ea9003
         d = 0;
Rex Dieter 8ea9003
     } else {
Rex Dieter 8ea9003
         QMutexLocker locker(&_q_manager()->mutex);
Rex Dieter 8ea9003
@@ -483,7 +483,7 @@ QDBusConnection &QDBusConnection::operator=(const QDBusConnection &other)
Rex Dieter 8ea9003
 */
Rex Dieter 8ea9003
 QDBusConnection QDBusConnection::connectToBus(BusType type, const QString &name)
Rex Dieter 8ea9003
 {
Rex Dieter 8ea9003
-    if (!qdbus_loadLibDBus()) {
Rex Dieter 8ea9003
+    if (_q_manager.isDestroyed() || !qdbus_loadLibDBus()) {
Rex Dieter 8ea9003
         QDBusConnectionPrivate *d = 0;
Rex Dieter 8ea9003
         return QDBusConnection(d);
Rex Dieter 8ea9003
     }
Rex Dieter 8ea9003
@@ -497,7 +497,7 @@ QDBusConnection QDBusConnection::connectToBus(BusType type, const QString &name)
Rex Dieter 8ea9003
 QDBusConnection QDBusConnection::connectToBus(const QString &address,
Rex Dieter 8ea9003
                                               const QString &name)
Rex Dieter 8ea9003
 {
Rex Dieter 8ea9003
-    if (!qdbus_loadLibDBus()) {
Rex Dieter 8ea9003
+    if (_q_manager.isDestroyed() || !qdbus_loadLibDBus()) {
Rex Dieter 8ea9003
         QDBusConnectionPrivate *d = 0;
Rex Dieter 8ea9003
         return QDBusConnection(d);
Rex Dieter 8ea9003
     }
Rex Dieter 8ea9003
@@ -512,7 +512,7 @@ QDBusConnection QDBusConnection::connectToBus(const QString &address,
Rex Dieter 8ea9003
 QDBusConnection QDBusConnection::connectToPeer(const QString &address,
Rex Dieter 8ea9003
                                                const QString &name)
Rex Dieter 8ea9003
 {
Rex Dieter 8ea9003
-    if (!qdbus_loadLibDBus()) {
Rex Dieter 8ea9003
+    if (_q_manager.isDestroyed() || !qdbus_loadLibDBus()) {
Rex Dieter 8ea9003
         QDBusConnectionPrivate *d = 0;
Rex Dieter 8ea9003
         return QDBusConnection(d);
Rex Dieter 8ea9003
     }
Rex Dieter 8ea9003
@@ -1167,6 +1167,8 @@ bool QDBusConnection::unregisterService(const QString &serviceName)
Rex Dieter 8ea9003
 */
Rex Dieter 8ea9003
 QDBusConnection QDBusConnection::sessionBus()
Rex Dieter 8ea9003
 {
Rex Dieter 8ea9003
+    if (_q_manager.isDestroyed())
Rex Dieter 8ea9003
+        return QDBusConnection(Q_NULLPTR);
Rex Dieter 8ea9003
     return QDBusConnection(_q_manager()->busConnection(SessionBus));
Rex Dieter 8ea9003
 }
Rex Dieter 8ea9003
 
Rex Dieter 8ea9003
@@ -1179,6 +1181,8 @@ QDBusConnection QDBusConnection::sessionBus()
Rex Dieter 8ea9003
 */
Rex Dieter 8ea9003
 QDBusConnection QDBusConnection::systemBus()
Rex Dieter 8ea9003
 {
Rex Dieter 8ea9003
+    if (_q_manager.isDestroyed())
Rex Dieter 8ea9003
+        return QDBusConnection(Q_NULLPTR);
Rex Dieter 8ea9003
     return QDBusConnection(_q_manager()->busConnection(SystemBus));
Rex Dieter 8ea9003
 }
Rex Dieter 8ea9003
 
Rex Dieter 8ea9003
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
Rex Dieter 8ea9003
index 19f79e9..f8dc702 100644
Rex Dieter 8ea9003
--- a/src/dbus/qdbusintegrator.cpp
Rex Dieter 8ea9003
+++ b/src/dbus/qdbusintegrator.cpp
Rex Dieter 8ea9003
@@ -299,6 +299,9 @@ static void qDBusNewConnection(DBusServer *server, DBusConnection *connection, v
Rex Dieter 8ea9003
     Q_ASSERT(connection);
Rex Dieter 8ea9003
     Q_ASSERT(data);
Rex Dieter 8ea9003
 
Rex Dieter 8ea9003
+    if (!QDBusConnectionManager::instance())
Rex Dieter 8ea9003
+        return;
Rex Dieter 8ea9003
+
Rex Dieter 8ea9003
     // keep the connection alive
Rex Dieter 8ea9003
     q_dbus_connection_ref(connection);
Rex Dieter 8ea9003
     QDBusConnectionPrivate *serverConnection = static_cast<QDBusConnectionPrivate *>(data);
Rex Dieter 8ea9003
diff --git a/src/dbus/qdbusserver.cpp b/src/dbus/qdbusserver.cpp
Rex Dieter 8ea9003
index 027ce93..b1f9be2 100644
Rex Dieter 8ea9003
--- a/src/dbus/qdbusserver.cpp
Rex Dieter 8ea9003
+++ b/src/dbus/qdbusserver.cpp
Rex Dieter 8ea9003
@@ -68,7 +68,11 @@ QDBusServer::QDBusServer(const QString &address, QObject *parent)
Rex Dieter 8ea9003
     if (!qdbus_loadLibDBus())
Rex Dieter 8ea9003
         return;
Rex Dieter 8ea9003
 
Rex Dieter 8ea9003
-    emit QDBusConnectionManager::instance()->serverRequested(address, this);
Rex Dieter 8ea9003
+    QDBusConnectionManager *instance = QDBusConnectionManager::instance();
Rex Dieter 8ea9003
+    if (!instance)
Rex Dieter 8ea9003
+        return;
Rex Dieter 8ea9003
+
Rex Dieter 8ea9003
+    emit instance->serverRequested(address, this);
Rex Dieter 8ea9003
     QObject::connect(d, SIGNAL(newServerConnection(QDBusConnectionPrivate*)),
Rex Dieter 8ea9003
                      this, SLOT(_q_newConnection(QDBusConnectionPrivate*)), Qt::QueuedConnection);
Rex Dieter 8ea9003
 }
Rex Dieter 8ea9003
@@ -93,7 +97,11 @@ QDBusServer::QDBusServer(QObject *parent)
Rex Dieter 8ea9003
         return;
Rex Dieter 8ea9003
     }
Rex Dieter 8ea9003
 
Rex Dieter 8ea9003
-    emit QDBusConnectionManager::instance()->serverRequested(address, this);
Rex Dieter 8ea9003
+    QDBusConnectionManager *instance = QDBusConnectionManager::instance();
Rex Dieter 8ea9003
+    if (!instance)
Rex Dieter 8ea9003
+        return;
Rex Dieter 8ea9003
+
Rex Dieter 8ea9003
+    emit instance->serverRequested(address, this);
Rex Dieter 8ea9003
     QObject::connect(d, SIGNAL(newServerConnection(QDBusConnectionPrivate*)),
Rex Dieter 8ea9003
                      this, SLOT(_q_newConnection(QDBusConnectionPrivate*)), Qt::QueuedConnection);
Rex Dieter 8ea9003
 }
Rex Dieter 8ea9003
-- 
Rex Dieter 8ea9003
2.9.3
Rex Dieter 8ea9003