Skip to content

Commit 9f85f0f

Browse files
committed
capicxx-dbus-runtime 3.1.12.11
1 parent 6a74d7c commit 9f85f0f

File tree

3 files changed

+21
-8
lines changed

3 files changed

+21
-8
lines changed

CHANGES

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
Changes
22
=======
3+
v3.1.12.11
4+
- Prevent crash when deregistering managed service (via 'deregisterManagedStub*') and
5+
another service (via 'unregisterService') in parallel with same DBus connection
6+
7+
v3.1.12.10
8+
- Unregister mappings in DBusAddressTranslator (to free memory again) when
9+
services/stubs are unregistered
10+
311
v3.1.12.9
412
- Unregister mappings in DBusAddressTranslator (to free memory again) when
513
proxies are destroyed

src/CommonAPI/DBus/DBusFactory.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,8 @@ Factory::unregisterStub(const std::string &_domain, const std::string &_interfac
203203

204204
services_.erase(adapterResult->first);
205205

206+
DBusAddressTranslator::get()->remove(address);
207+
206208
itsLock.unlock();
207209

208210
decrementConnection(connection);

src/CommonAPI/DBus/DBusObjectManager.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ bool DBusObjectManager::registerDBusStubAdapter(std::shared_ptr<DBusStubAdapter>
4949
DBusInterfaceHandlerPath dbusStubAdapterHandlerPath(dbusStubAdapterObjectPath, dbusStubAdapterInterfaceName);
5050
bool isRegistrationSuccessful = false;
5151

52-
objectPathLock_.lock();
52+
std::lock_guard<std::recursive_mutex> itsLock(objectPathLock_);
53+
5354
isRegistrationSuccessful = addDBusInterfaceHandler(dbusStubAdapterHandlerPath, dbusStubAdapter);
5455

5556
if (isRegistrationSuccessful && dbusStubAdapter->hasFreedesktopProperties()) {
@@ -109,7 +110,6 @@ bool DBusObjectManager::registerDBusStubAdapter(std::shared_ptr<DBusStubAdapter>
109110
dbusConnection->registerObjectPath(dbusStubAdapterObjectPath);
110111
}
111112
}
112-
objectPathLock_.unlock();
113113

114114
return isRegistrationSuccessful;
115115
}
@@ -121,7 +121,8 @@ bool DBusObjectManager::unregisterDBusStubAdapter(std::shared_ptr<DBusStubAdapte
121121
DBusInterfaceHandlerPath dbusStubAdapterHandlerPath(dbusStubAdapterObjectPath, dbusStubAdapterInterfaceName);
122122
bool isDeregistrationSuccessful = false;
123123

124-
objectPathLock_.lock();
124+
std::lock_guard<std::recursive_mutex> itsLock(objectPathLock_);
125+
125126
isDeregistrationSuccessful = removeDBusInterfaceHandler(dbusStubAdapterHandlerPath, dbusStubAdapter);
126127

127128
if (isDeregistrationSuccessful && dbusStubAdapter->isManaging()) {
@@ -162,13 +163,13 @@ bool DBusObjectManager::unregisterDBusStubAdapter(std::shared_ptr<DBusStubAdapte
162163
}
163164
}
164165

165-
objectPathLock_.unlock();
166-
167166
return isDeregistrationSuccessful;
168167
}
169168

170169

171170
bool DBusObjectManager::exportManagedDBusStubAdapter(const std::string& parentObjectPath, std::shared_ptr<DBusStubAdapter> dbusStubAdapter) {
171+
std::lock_guard<std::recursive_mutex> itsLock(objectPathLock_);
172+
172173
auto foundManagerStubIterator = managerStubs_.find(parentObjectPath);
173174

174175
if (managerStubs_.end() == foundManagerStubIterator) {
@@ -182,6 +183,8 @@ bool DBusObjectManager::exportManagedDBusStubAdapter(const std::string& parentOb
182183

183184

184185
bool DBusObjectManager::unexportManagedDBusStubAdapter(const std::string& parentObjectPath, std::shared_ptr<DBusStubAdapter> dbusStubAdapter) {
186+
std::lock_guard<std::recursive_mutex> itsLock(objectPathLock_);
187+
185188
auto foundManagerStubIterator = managerStubs_.find(parentObjectPath);
186189

187190
if (foundManagerStubIterator != managerStubs_.end()) {
@@ -208,20 +211,20 @@ bool DBusObjectManager::handleMessage(const DBusMessage& dbusMessage) {
208211

209212
DBusInterfaceHandlerPath handlerPath(objectPath, interfaceName);
210213

211-
objectPathLock_.lock();
214+
std::unique_lock<std::recursive_mutex> itsLock(objectPathLock_);
215+
212216
auto handlerIterator = dbusRegisteredObjectsTable_.find(handlerPath);
213217
const bool foundDBusInterfaceHandler = handlerIterator != dbusRegisteredObjectsTable_.end();
214218
bool dbusMessageHandled = false;
215219

216220
if (foundDBusInterfaceHandler) {
217221
std::shared_ptr<DBusInterfaceHandler> dbusStubAdapterBase = handlerIterator->second.front();
218-
objectPathLock_.unlock();
222+
itsLock.unlock();
219223
dbusMessageHandled = dbusStubAdapterBase->onInterfaceDBusMessage(dbusMessage);
220224
return dbusMessageHandled;
221225
} else if (dbusMessage.hasInterfaceName("org.freedesktop.DBus.Introspectable")) {
222226
dbusMessageHandled = onIntrospectableInterfaceDBusMessage(dbusMessage);
223227
}
224-
objectPathLock_.unlock();
225228

226229
return dbusMessageHandled;
227230
}

0 commit comments

Comments
 (0)