diff --git a/src/ice_transport.cpp b/src/ice_transport.cpp index 3e074f316b10d9f09296cb8c31fd72aeab0cd9dd..bd162c09fcd95b09d9e00d0dd5fe6be1113c3646 100644 --- a/src/ice_transport.cpp +++ b/src/ice_transport.cpp @@ -120,6 +120,7 @@ public: IceTransportCompleteCb on_initdone_cb_; IceTransportCompleteCb on_negodone_cb_; IceRecvInfo on_recv_cb_; + mutable std::mutex iceMutex_ {}; std::unique_ptr<pj_ice_strans, IceSTransDeleter> icest_; unsigned component_count_; pj_ice_sess_cand cand_[MAX_CANDIDATES] {}; @@ -127,7 +128,6 @@ public: std::string local_pwd_; pj_sockaddr remoteAddr_; std::condition_variable iceCV_ {}; - mutable std::mutex iceMutex_ {}; pj_ice_strans_cfg config_; std::string last_errmsg_; @@ -707,8 +707,8 @@ void IceTransport::Impl::addReflectiveCandidate(int comp_id, const IpAddr &base, for (unsigned i = 0; i < config_.stun_tp_cnt; ++i) { if (config_.stun_tp[i].af == af) { - idx = i; - break; + idx = i; + break; } } if (idx < 0) { @@ -735,6 +735,8 @@ void IceTransport::Impl::addReflectiveCandidate(int comp_id, const IpAddr &base, pj_ice_calc_foundation(pool_.get(), &cand.foundation, cand.type, &cand.base_addr); + std::lock_guard<std::mutex> lk(iceMutex_); + if (!icest_) return; auto ret = pj_ice_sess_add_cand( pj_ice_strans_get_ice_sess(icest_.get()), cand.comp_id, cand.transport_id, cand.type, cand.local_pref, &cand.foundation, &cand.addr, &cand.base_addr, @@ -964,6 +966,8 @@ IceTransport::start(const SDP& sdp) if (getCandidateFromSDP(line, cand)) rem_candidates.emplace_back(cand); } + std::lock_guard<std::mutex> lk {pimpl_->iceMutex_}; + if (!pimpl_->icest_) return false; auto status = pj_ice_strans_start_ice(pimpl_->icest_.get(), pj_strset(&ufrag, (char*)sdp.ufrag.c_str(), sdp.ufrag.size()), pj_strset(&pwd, (char*)sdp.pwd.c_str(), sdp.pwd.size()), @@ -985,6 +989,8 @@ IceTransport::stop() { pimpl_->is_stopped_ = true; if (isStarted()) { + std::lock_guard<std::mutex> lk {pimpl_->iceMutex_}; + if (!pimpl_->icest_) return false; auto status = pj_ice_strans_stop_ice(pimpl_->icest_.get()); if (status != PJ_SUCCESS) { pimpl_->last_errmsg_ = sip_utils::sip_strerror(status); @@ -1028,9 +1034,14 @@ IceTransport::getLocalCandidates(unsigned comp_id) const pj_ice_sess_cand cand[PJ_ARRAY_SIZE(pimpl_->cand_)]; unsigned cand_cnt = PJ_ARRAY_SIZE(cand); - if (pj_ice_strans_enum_cands(pimpl_->icest_.get(), comp_id+1, &cand_cnt, cand) != PJ_SUCCESS) { - JAMI_ERR("[ice:%p] pj_ice_strans_enum_cands() failed", this); - return res; + + { + std::lock_guard<std::mutex> lk {pimpl_->iceMutex_}; + if (!pimpl_->icest_) return res; + if (pj_ice_strans_enum_cands(pimpl_->icest_.get(), comp_id+1, &cand_cnt, cand) != PJ_SUCCESS) { + JAMI_ERR("[ice:%p] pj_ice_strans_enum_cands() failed", this); + return res; + } } for (unsigned i=0; i<cand_cnt; ++i) {