From ae742d3fbf7a4665bfe1807f99b01a1fb51dba76 Mon Sep 17 00:00:00 2001 From: Adrien Beraud <adrien.beraud@savoirfairelinux.com> Date: Tue, 12 Nov 2024 11:41:04 -0500 Subject: [PATCH] jamiaccount: protect handler with mutex Change-Id: I3cf73bd145b41e313ec4bc866ce51a542fe188e3 --- src/jamidht/jamiaccount.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/jamidht/jamiaccount.cpp b/src/jamidht/jamiaccount.cpp index 0d6472ff4..10213070a 100644 --- a/src/jamidht/jamiaccount.cpp +++ b/src/jamidht/jamiaccount.cpp @@ -3039,7 +3039,14 @@ JamiAccount::sendMessage(const std::string& to, auto devices = std::make_shared<std::set<DeviceId>>(); // Use the Message channel if available - auto* handler = static_cast<MessageChannelHandler*>(channelHandlers_[Uri::Scheme::MESSAGE].get()); + std::unique_lock clk(connManagerMtx_); + auto* handler =static_cast<MessageChannelHandler*>(channelHandlers_[Uri::Scheme::MESSAGE].get()); + if (!handler) { + clk.unlock(); + if (!onlyConnected) + messageEngine_.onMessageSent(to, token, false, deviceId); + return; + } const auto& payload = *payloads.begin(); MessageChannelHandler::Message msg; msg.t = payload.first; @@ -3047,7 +3054,9 @@ JamiAccount::sendMessage(const std::string& to, auto device = deviceId.empty() ? DeviceId() : DeviceId(deviceId); if (deviceId.empty()) { bool sent = false; - for (const auto &conn: handler->getChannels(toUri)) { + auto conns = handler->getChannels(toUri); + clk.unlock(); + for (const auto &conn: conns) { if (MessageChannelHandler::sendMessage(conn, msg)) { devices->emplace(conn->deviceId()); sent = true; @@ -3060,7 +3069,8 @@ JamiAccount::sendMessage(const std::string& to, }); } } else { - if (const auto &conn = handler->getChannel(toUri, device)) { + if (auto conn = handler->getChannel(toUri, device)) { + clk.unlock(); if (MessageChannelHandler::sendMessage(conn, msg)) { if (!onlyConnected) runOnMainThread([w = weak(), to, token, deviceId]() { @@ -3071,6 +3081,8 @@ JamiAccount::sendMessage(const std::string& to, } } } + if (clk) + clk.unlock(); std::unique_lock lk(sipConnsMtx_); for (auto& [key, value]: sipConns_) { -- GitLab