Skip to content
Snippets Groups Projects
Unverified Commit c2689185 authored by Sébastien Blin's avatar Sébastien Blin
Browse files

sipcall: protect transport modifications via a mutex

Since all is async, sometimes, it's possible to call setupLocalSDPFromIce
before that initIceMediaTransport is done, stopping the call in a weird
way.

Change-Id: I5e329a4a44db61e24ac559535a4f6c72f4527ae4
parent cdd1f24e
Branches
Tags
No related merge requests found
...@@ -110,9 +110,12 @@ SIPCall::SIPCall(SIPAccountBase& account, ...@@ -110,9 +110,12 @@ SIPCall::SIPCall(SIPAccountBase& account,
SIPCall::~SIPCall() SIPCall::~SIPCall()
{ {
std::lock_guard<std::recursive_mutex> lk {callMutex_}; std::lock_guard<std::recursive_mutex> lk {callMutex_};
{
std::lock_guard<std::mutex> lk(transportMtx_);
if (tmpMediaTransport_) if (tmpMediaTransport_)
dht::ThreadPool::io().run([ice = std::make_shared<decltype(tmpMediaTransport_)>( dht::ThreadPool::io().run([ice = std::make_shared<decltype(tmpMediaTransport_)>(
std::move(tmpMediaTransport_))] {}); std::move(tmpMediaTransport_))] {});
}
setTransport({}); setTransport({});
inv.reset(); // prevents callback usage inv.reset(); // prevents callback usage
} }
...@@ -1327,15 +1330,18 @@ SIPCall::waitForIceAndStartMedia() ...@@ -1327,15 +1330,18 @@ SIPCall::waitForIceAndStartMedia()
// Nego succeed: move to the new media transport // Nego succeed: move to the new media transport
call->stopAllMedia(); call->stopAllMedia();
{
std::lock_guard<std::mutex> lk(call->transportMtx_);
if (call->tmpMediaTransport_) { if (call->tmpMediaTransport_) {
// Destroy the ICE media transport on another thread. This can take quite // Destroy the ICE media transport on another thread. This can take
// some time. // quite some time.
if (call->mediaTransport_) if (call->mediaTransport_)
dht::ThreadPool::io().run( dht::ThreadPool::io().run(
[ice = std::make_shared<decltype(call->mediaTransport_)>( [ice = std::make_shared<decltype(call->mediaTransport_)>(
std::move(call->mediaTransport_))] {}); std::move(call->mediaTransport_))] {});
call->mediaTransport_ = std::move(call->tmpMediaTransport_); call->mediaTransport_ = std::move(call->tmpMediaTransport_);
} }
}
call->startAllMedia(); call->startAllMedia();
return false; return false;
} }
...@@ -1539,6 +1545,7 @@ SIPCall::initIceMediaTransport(bool master, ...@@ -1539,6 +1545,7 @@ SIPCall::initIceMediaTransport(bool master,
std::optional<IceTransportOptions> options, std::optional<IceTransportOptions> options,
unsigned channel_num) unsigned channel_num)
{ {
std::lock_guard<std::mutex> lk(transportMtx_);
JAMI_DBG("[call:%s] create media ICE transport", getCallId().c_str()); JAMI_DBG("[call:%s] create media ICE transport", getCallId().c_str());
auto iceOptions = options == std::nullopt ? getAccount().getIceOptions() : *options; auto iceOptions = options == std::nullopt ? getAccount().getIceOptions() : *options;
...@@ -1571,8 +1578,11 @@ SIPCall::merge(Call& call) ...@@ -1571,8 +1578,11 @@ SIPCall::merge(Call& call)
pj_strcpy(&contactHeader_, &subcall.contactHeader_); pj_strcpy(&contactHeader_, &subcall.contactHeader_);
localAudioPort_ = subcall.localAudioPort_; localAudioPort_ = subcall.localAudioPort_;
localVideoPort_ = subcall.localVideoPort_; localVideoPort_ = subcall.localVideoPort_;
{
std::lock_guard<std::mutex> lk(transportMtx_);
mediaTransport_ = std::move(subcall.mediaTransport_); mediaTransport_ = std::move(subcall.mediaTransport_);
tmpMediaTransport_ = std::move(subcall.tmpMediaTransport_); tmpMediaTransport_ = std::move(subcall.tmpMediaTransport_);
}
Call::merge(subcall); Call::merge(subcall);
......
...@@ -248,8 +248,10 @@ private: ...@@ -248,8 +248,10 @@ private:
NON_COPYABLE(SIPCall); NON_COPYABLE(SIPCall);
mutable std::mutex transportMtx_ {};
IceTransport* getIceMediaTransport() const IceTransport* getIceMediaTransport() const
{ {
std::lock_guard<std::mutex> lk(transportMtx_);
return tmpMediaTransport_ ? tmpMediaTransport_.get() : mediaTransport_.get(); return tmpMediaTransport_ ? tmpMediaTransport_.get() : mediaTransport_.get();
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment