diff --git a/src/jamidht/jamiaccount.cpp b/src/jamidht/jamiaccount.cpp index df75d68763c2963b984d6f1f294575d33e81c8b5..58ab39ecfdbc224bb534b2c90e7c5011eb8e02d2 100644 --- a/src/jamidht/jamiaccount.cpp +++ b/src/jamidht/jamiaccount.cpp @@ -484,6 +484,10 @@ JamiAccount::startOutgoingCall(const std::shared_ptr<SIPCall>& call, const std:: auto& it = deviceConnIt->second.back(); auto transport = it.transport; + if (!it.channel->underlyingICE()) { + JAMI_WARN("A SIP transport exists without Channel, this is a bug. Please report"); + continue; + } if (!transport) continue; call->setTransport(transport); @@ -3181,10 +3185,12 @@ JamiAccount::requestSIPConnection(const std::string& peerId, const std::string& JAMI_INFO("Ask %s for a new SIP channel", deviceId.c_str()); if (!connectionManager_) return; connectionManager_->connectDevice(deviceId, "sip", - [w=weak(), id](std::shared_ptr<ChannelSocket> socket) { + [w=weak(), id](std::shared_ptr<ChannelSocket>) { auto shared = w.lock(); if (!shared) return; - if (socket) shared->cacheSIPConnection(std::move(socket), id.first, id.second); + // NOTE: No need to cache Connection there. OnConnectionReady + // is called before this callback, so the socket is already + // cached if succeed. We just need to remove the pending request. std::lock_guard<std::mutex> lk(shared->sipConnectionsMtx_); shared->pendingSipConnections_.erase(id); }); @@ -3194,6 +3200,16 @@ void JamiAccount::cacheSIPConnection(std::shared_ptr<ChannelSocket>&& socket, const std::string& peerId, const std::string& deviceId) { std::unique_lock<std::mutex> lk(sipConnectionsMtx_); + // Verify that the connection is not already cached + auto& connections = sipConnections_[peerId][deviceId]; + auto conn = std::find_if(connections.begin(), connections.end(), [socket](auto v) { + return v.channel == socket; + }); + if (conn != connections.end()) { + JAMI_WARN("Channel socket already cached with this peer"); + return; + } + // Convert to SIP transport sip_utils::register_thread(); auto onShutdown = [w=weak(), peerId, deviceId, socket]() { @@ -3201,11 +3217,12 @@ JamiAccount::cacheSIPConnection(std::shared_ptr<ChannelSocket>&& socket, const s if (!shared) return; std::lock_guard<std::mutex> lk(shared->sipConnectionsMtx_); auto& connections = shared->sipConnections_[peerId][deviceId]; - auto conn = std::find_if(connections.begin(), connections.end(), [socket](auto v) { - return v.channel == socket; - }); - if (conn != connections.end()) { - connections.erase(conn); + auto conn = connections.begin(); + while (conn != connections.end()) { + if (conn->channel == socket) + conn = connections.erase(conn); + else + conn++; } }; auto sip_tr = link_->sipTransportBroker->getChanneledTransport(socket, std::move(onShutdown));