Index: webrtc/pc/srtpfilter.cc |
diff --git a/webrtc/pc/srtpfilter.cc b/webrtc/pc/srtpfilter.cc |
index e4796fd6720fb6d9cc6c81c0bff5abfdf7e9e0d6..60dd4f1c609a02cef799a37b23722af4b15e6421 100644 |
--- a/webrtc/pc/srtpfilter.cc |
+++ b/webrtc/pc/srtpfilter.cc |
@@ -16,6 +16,7 @@ |
#include "webrtc/base/base64.h" |
#include "webrtc/base/byteorder.h" |
+#include "webrtc/base/checks.h" |
#include "webrtc/base/common.h" |
#include "webrtc/base/logging.h" |
#include "webrtc/base/stringencode.h" |
@@ -197,7 +198,7 @@ bool SrtpFilter::ProtectRtp(void* p, int in_len, int max_len, int* out_len) { |
LOG(LS_WARNING) << "Failed to ProtectRtp: SRTP not active"; |
return false; |
} |
- ASSERT(send_session_ != NULL); |
+ RTC_CHECK(send_session_); |
return send_session_->ProtectRtp(p, in_len, max_len, out_len); |
} |
@@ -210,7 +211,7 @@ bool SrtpFilter::ProtectRtp(void* p, |
LOG(LS_WARNING) << "Failed to ProtectRtp: SRTP not active"; |
return false; |
} |
- ASSERT(send_session_ != NULL); |
+ RTC_CHECK(send_session_); |
return send_session_->ProtectRtp(p, in_len, max_len, out_len, index); |
} |
@@ -222,7 +223,7 @@ bool SrtpFilter::ProtectRtcp(void* p, int in_len, int max_len, int* out_len) { |
if (send_rtcp_session_) { |
return send_rtcp_session_->ProtectRtcp(p, in_len, max_len, out_len); |
} else { |
- ASSERT(send_session_ != NULL); |
+ RTC_CHECK(send_session_); |
return send_session_->ProtectRtcp(p, in_len, max_len, out_len); |
} |
} |
@@ -232,7 +233,7 @@ bool SrtpFilter::UnprotectRtp(void* p, int in_len, int* out_len) { |
LOG(LS_WARNING) << "Failed to UnprotectRtp: SRTP not active"; |
return false; |
} |
- ASSERT(recv_session_ != NULL); |
+ RTC_CHECK(recv_session_); |
return recv_session_->UnprotectRtp(p, in_len, out_len); |
} |
@@ -244,7 +245,7 @@ bool SrtpFilter::UnprotectRtcp(void* p, int in_len, int* out_len) { |
if (recv_rtcp_session_) { |
return recv_rtcp_session_->UnprotectRtcp(p, in_len, out_len); |
} else { |
- ASSERT(recv_session_ != NULL); |
+ RTC_CHECK(recv_session_); |
return recv_session_->UnprotectRtcp(p, in_len, out_len); |
} |
} |
@@ -255,16 +256,16 @@ bool SrtpFilter::GetRtpAuthParams(uint8_t** key, int* key_len, int* tag_len) { |
return false; |
} |
- ASSERT(send_session_ != NULL); |
+ RTC_CHECK(send_session_); |
return send_session_->GetRtpAuthParams(key, key_len, tag_len); |
} |
void SrtpFilter::set_signal_silent_time(int signal_silent_time_in_ms) { |
signal_silent_time_in_ms_ = signal_silent_time_in_ms; |
if (IsActive()) { |
- ASSERT(send_session_ != NULL); |
+ RTC_CHECK(send_session_); |
send_session_->set_signal_silent_time(signal_silent_time_in_ms); |
- ASSERT(recv_session_ != NULL); |
+ RTC_CHECK(recv_session_); |
recv_session_->set_signal_silent_time(signal_silent_time_in_ms); |
if (send_rtcp_session_) |
send_rtcp_session_->set_signal_silent_time(signal_silent_time_in_ms); |
@@ -452,7 +453,7 @@ bool SrtpFilter::ParseKeyParams(const std::string& key_params, |
// Fail if base64 decode fails, or the key is the wrong size. |
std::string key_b64(key_params.substr(7)), key_str; |
if (!rtc::Base64::Decode(key_b64, rtc::Base64::DO_STRICT, |
- &key_str, NULL) || |
+ &key_str, nullptr) || |
static_cast<int>(key_str.size()) != len) { |
return false; |
} |
@@ -468,28 +469,21 @@ 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() |
- : session_(NULL), |
+ : session_(nullptr), |
rtp_auth_tag_len_(0), |
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)); |
- } |
if (session_) { |
+ srtp_set_user_data(session_, nullptr); |
srtp_dealloc(session_); |
} |
} |
@@ -503,6 +497,7 @@ bool SrtpSession::SetRecv(int 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; |
@@ -545,6 +540,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; |
@@ -568,6 +564,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; |
@@ -587,6 +584,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; |
@@ -604,7 +602,8 @@ 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) |
- ExternalHmacContext* external_hmac = NULL; |
+ RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ ExternalHmacContext* external_hmac = nullptr; |
// stream_template will be the reference context for other streams. |
// Let's use it for getting the keys. |
srtp_stream_ctx_t* srtp_context = session_->stream_template; |
@@ -630,10 +629,12 @@ 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) |
+ if (!stream) { |
return false; |
+ } |
// Shift packet index, put into network byte order |
*index = static_cast<int64_t>( |
@@ -646,6 +647,7 @@ void SrtpSession::set_signal_silent_time(int signal_silent_time_in_ms) { |
} |
bool SrtpSession::SetKey(int type, int 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"; |
@@ -692,16 +694,16 @@ bool SrtpSession::SetKey(int type, int cs, const uint8_t* key, int len) { |
policy.rtp.auth_type = EXTERNAL_HMAC_SHA1; |
} |
#endif |
- policy.next = NULL; |
+ policy.next = nullptr; |
int err = srtp_create(&session_, &policy); |
if (err != err_status_ok) { |
- session_ = NULL; |
+ session_ = nullptr; |
LOG(LS_ERROR) << "Failed to create SRTP session, err=" << err; |
return false; |
} |
- |
+ srtp_set_user_data(session_, this); |
rtp_auth_tag_len_ = policy.rtp.auth_tag_len; |
rtcp_auth_tag_len_ = policy.rtcp.auth_tag_len; |
return true; |
@@ -750,6 +752,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"; |
@@ -770,22 +773,15 @@ 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*>( |
+ srtp_get_user_data(ev->session)); |
+ 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. |