From 8502749512b58b6567ebc0121b3b29019a6125a3 Mon Sep 17 00:00:00 2001 From: Philip Rauwolf Date: Tue, 19 Mar 2013 10:35:39 +0100 Subject: [PATCH] Prevented independent double instantiation of DBusObjectManager and DBusServiceRegistry within the DBusConnection. Also prevented access to the not-yet-instantiated DBusObjectManager member variable of DBusConnection when an external call arrives "too early". --- src/CommonAPI/DBus/DBusConnection.cpp | 22 +++++++++++++++------- src/CommonAPI/DBus/DBusConnection.h | 4 +++- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/CommonAPI/DBus/DBusConnection.cpp b/src/CommonAPI/DBus/DBusConnection.cpp index acc0b3e..3f98c0b 100644 --- a/src/CommonAPI/DBus/DBusConnection.cpp +++ b/src/CommonAPI/DBus/DBusConnection.cpp @@ -149,9 +149,13 @@ DBusProxyConnection::ConnectionStatusEvent& DBusConnection::getConnectionStatusE const std::shared_ptr DBusConnection::getDBusServiceRegistry() { std::shared_ptr serviceRegistry = dbusServiceRegistry_.lock(); if (!serviceRegistry || dbusServiceRegistry_.expired()) { - serviceRegistry = std::make_shared(shared_from_this()); - serviceRegistry->init(); - dbusServiceRegistry_ = serviceRegistry; + serviceRegistryGuard_.lock(); + if (!serviceRegistry || dbusServiceRegistry_.expired()) { + serviceRegistry = std::make_shared(shared_from_this()); + serviceRegistry->init(); + dbusServiceRegistry_ = serviceRegistry; + } + serviceRegistryGuard_.unlock(); } return serviceRegistry; @@ -159,7 +163,11 @@ const std::shared_ptr DBusConnection::getDBusServiceRegistr const std::shared_ptr DBusConnection::getDBusObjectManager() { if (!dbusObjectManager_) { - dbusObjectManager_ = std::make_shared(shared_from_this()); + objectManagerGuard_.lock(); + if (!dbusObjectManager_) { + dbusObjectManager_ = std::make_shared(shared_from_this()); + } + objectManagerGuard_.unlock(); } return dbusObjectManager_; @@ -531,7 +539,7 @@ void DBusConnection::initLibdbusSignalFilterAfterConnect() { resumeDispatching(); } -::DBusHandlerResult DBusConnection::onLibdbusObjectPathMessage(::DBusMessage* libdbusMessage) const { +::DBusHandlerResult DBusConnection::onLibdbusObjectPathMessage(::DBusMessage* libdbusMessage) { assert(libdbusMessage); // handle only method call messages @@ -539,7 +547,7 @@ void DBusConnection::initLibdbusSignalFilterAfterConnect() { return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } - bool isDBusMessageHandled = dbusObjectManager_->handleMessage(DBusMessage(libdbusMessage)); + bool isDBusMessageHandled = getDBusObjectManager()->handleMessage(DBusMessage(libdbusMessage)); return isDBusMessageHandled ? DBUS_HANDLER_RESULT_HANDLED : DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } @@ -607,7 +615,7 @@ void DBusConnection::initLibdbusSignalFilterAfterConnect() { assert(libdbusMessage); assert(userData); - const DBusConnection* dbusConnection = reinterpret_cast(userData); + DBusConnection* dbusConnection = reinterpret_cast(userData); assert(dbusConnection->libdbusConnection_ == libdbusConnection); diff --git a/src/CommonAPI/DBus/DBusConnection.h b/src/CommonAPI/DBus/DBusConnection.h index d6a7314..2f7923f 100644 --- a/src/CommonAPI/DBus/DBusConnection.h +++ b/src/CommonAPI/DBus/DBusConnection.h @@ -122,7 +122,7 @@ class DBusConnection: public DBusProxyConnection, public std::enable_shared_from void initLibdbusSignalFilterAfterConnect(); - ::DBusHandlerResult onLibdbusObjectPathMessage(::DBusMessage* libdbusMessage) const; + ::DBusHandlerResult onLibdbusObjectPathMessage(::DBusMessage* libdbusMessage); ::DBusHandlerResult onLibdbusSignalFilter(::DBusMessage* libdbusMessage); @@ -142,6 +142,8 @@ class DBusConnection: public DBusProxyConnection, public std::enable_shared_from ::DBusConnection* libdbusConnection_; std::mutex libdbusConnectionGuard_; std::mutex signalGuard_; + std::mutex objectManagerGuard_; + std::mutex serviceRegistryGuard_; std::weak_ptr dbusServiceRegistry_; std::shared_ptr dbusObjectManager_; -- 2.7.4