Index: talk/session/media/srtpfilter.cc |
diff --git a/talk/session/media/srtpfilter.cc b/talk/session/media/srtpfilter.cc |
index 079ddfb57ee553474c2a42470c2de446d4b9c390..4b2412fc480f77dc3229a83164726f7bccdffd45 100644 |
--- a/talk/session/media/srtpfilter.cc |
+++ b/talk/session/media/srtpfilter.cc |
@@ -481,7 +481,7 @@ bool SrtpFilter::ParseKeyParams(const std::string& key_params, |
bool SrtpSession::inited_ = false; |
-// This lock protects SrtpSession::inited_ and SrtpSession::sessions_. |
+// This lock protects SrtpSession::inited_. |
rtc::GlobalLockPod SrtpSession::lock_; |
SrtpSession::SrtpSession() |
@@ -490,19 +490,13 @@ SrtpSession::SrtpSession() |
rtcp_auth_tag_len_(0), |
srtp_stat_(new SrtpStat()), |
last_send_seq_num_(-1) { |
- { |
- rtc::GlobalLockScope ls(&lock_); |
- sessions()->push_back(this); |
- } |
SignalSrtpError.repeat(srtp_stat_->SignalSrtpError); |
} |
SrtpSession::~SrtpSession() { |
- { |
- rtc::GlobalLockScope ls(&lock_); |
- sessions()->erase(std::find(sessions()->begin(), sessions()->end(), this)); |
- } |
+ RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
if (session_) { |
+ session_->user_data = nullptr; |
srtp_dealloc(session_); |
} |
} |
@@ -516,6 +510,7 @@ bool SrtpSession::SetRecv(const std::string& cs, const uint8_t* key, int len) { |
} |
bool SrtpSession::ProtectRtp(void* p, int in_len, int max_len, int* out_len) { |
+ RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
if (!session_) { |
LOG(LS_WARNING) << "Failed to protect SRTP packet: no SRTP Session"; |
return false; |
@@ -558,6 +553,7 @@ bool SrtpSession::ProtectRtp(void* p, |
} |
bool SrtpSession::ProtectRtcp(void* p, int in_len, int max_len, int* out_len) { |
+ RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
if (!session_) { |
LOG(LS_WARNING) << "Failed to protect SRTCP packet: no SRTP Session"; |
return false; |
@@ -581,6 +577,7 @@ bool SrtpSession::ProtectRtcp(void* p, int in_len, int max_len, int* out_len) { |
} |
bool SrtpSession::UnprotectRtp(void* p, int in_len, int* out_len) { |
+ RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
if (!session_) { |
LOG(LS_WARNING) << "Failed to unprotect SRTP packet: no SRTP Session"; |
return false; |
@@ -600,6 +597,7 @@ bool SrtpSession::UnprotectRtp(void* p, int in_len, int* out_len) { |
} |
bool SrtpSession::UnprotectRtcp(void* p, int in_len, int* out_len) { |
+ RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
if (!session_) { |
LOG(LS_WARNING) << "Failed to unprotect SRTCP packet: no SRTP Session"; |
return false; |
@@ -617,6 +615,7 @@ bool SrtpSession::UnprotectRtcp(void* p, int in_len, int* out_len) { |
bool SrtpSession::GetRtpAuthParams(uint8_t** key, int* key_len, int* tag_len) { |
#if defined(ENABLE_EXTERNAL_AUTH) |
+ RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
ExternalHmacContext* external_hmac = NULL; |
// stream_template will be the reference context for other streams. |
// Let's use it for getting the keys. |
@@ -643,6 +642,7 @@ bool SrtpSession::GetRtpAuthParams(uint8_t** key, int* key_len, int* tag_len) { |
bool SrtpSession::GetSendStreamPacketIndex(void* p, |
int in_len, |
int64_t* index) { |
+ RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
srtp_hdr_t* hdr = reinterpret_cast<srtp_hdr_t*>(p); |
srtp_stream_ctx_t* stream = srtp_get_stream(session_, hdr->ssrc); |
if (stream == NULL) |
@@ -662,6 +662,7 @@ bool SrtpSession::SetKey(int type, |
const std::string& cs, |
const uint8_t* key, |
int len) { |
+ RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
if (session_) { |
LOG(LS_ERROR) << "Failed to create SRTP session: " |
<< "SRTP session already created"; |
@@ -717,7 +718,7 @@ bool SrtpSession::SetKey(int type, |
return false; |
} |
- |
+ session_->user_data = this; |
rtp_auth_tag_len_ = policy.rtp.auth_tag_len; |
rtcp_auth_tag_len_ = policy.rtcp.auth_tag_len; |
return true; |
@@ -766,6 +767,7 @@ void SrtpSession::Terminate() { |
} |
void SrtpSession::HandleEvent(const srtp_event_data_t* ev) { |
+ RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
switch (ev->event) { |
case event_ssrc_collision: |
LOG(LS_INFO) << "SRTP event: SSRC collision"; |
@@ -786,22 +788,14 @@ void SrtpSession::HandleEvent(const srtp_event_data_t* ev) { |
} |
void SrtpSession::HandleEventThunk(srtp_event_data_t* ev) { |
- rtc::GlobalLockScope ls(&lock_); |
- |
- for (std::list<SrtpSession*>::iterator it = sessions()->begin(); |
- it != sessions()->end(); ++it) { |
- if ((*it)->session_ == ev->session) { |
- (*it)->HandleEvent(ev); |
- break; |
- } |
+ // Callback will be executed from same thread that calls the "srtp_protect" |
+ // and "srtp_unprotect" functions. |
+ SrtpSession* session = static_cast<SrtpSession*>(ev->session->user_data); |
+ if (session) { |
+ session->HandleEvent(ev); |
} |
} |
-std::list<SrtpSession*>* SrtpSession::sessions() { |
- RTC_DEFINE_STATIC_LOCAL(std::list<SrtpSession*>, sessions, ()); |
- return &sessions; |
-} |
- |
#else // !HAVE_SRTP |
// On some systems, SRTP is not (yet) available. |