Index: talk/app/webrtc/webrtcsession.cc |
diff --git a/talk/app/webrtc/webrtcsession.cc b/talk/app/webrtc/webrtcsession.cc |
index 29a4f3394a32c8674d272aa7b007bc0053066c52..d8f76379c1b8925b537a9e83c3a0bf98c9c908f4 100644 |
--- a/talk/app/webrtc/webrtcsession.cc |
+++ b/talk/app/webrtc/webrtcsession.cc |
@@ -761,14 +761,20 @@ cricket::SecurePolicy WebRtcSession::SdesPolicy() const { |
return webrtc_session_desc_factory_->SdesPolicy(); |
} |
-bool WebRtcSession::GetSslRole(rtc::SSLRole* role) { |
+bool WebRtcSession::GetSslRole(const std::string& transport_name, |
+ rtc::SSLRole* role) { |
if (!local_desc_ || !remote_desc_) { |
LOG(LS_INFO) << "Local and Remote descriptions must be applied to get " |
<< "SSL Role of the session."; |
return false; |
} |
- return transport_controller_->GetSslRole(role); |
+ return transport_controller_->GetSslRole(transport_name, role); |
+} |
+ |
+bool WebRtcSession::GetSslRole(const cricket::BaseChannel* channel, |
+ rtc::SSLRole* role) { |
+ return channel && GetSslRole(channel->transport_name(), role); |
} |
void WebRtcSession::CreateOffer( |
@@ -970,15 +976,12 @@ bool WebRtcSession::UpdateSessionState( |
return BadPranswerSdp(source, GetSessionErrorMsg(), err_desc); |
} |
} else if (action == kAnswer) { |
- if (!PushdownTransportDescription(source, cricket::CA_ANSWER, &td_err)) { |
- return BadAnswerSdp(source, MakeTdErrorString(td_err), err_desc); |
- } |
const cricket::ContentGroup* local_bundle = |
local_desc_->description()->GetGroupByName(cricket::GROUP_TYPE_BUNDLE); |
const cricket::ContentGroup* remote_bundle = |
remote_desc_->description()->GetGroupByName(cricket::GROUP_TYPE_BUNDLE); |
if (local_bundle && remote_bundle) { |
- // The answerer decides the transport to bundle on |
+ // The answerer decides the transport to bundle on. |
const cricket::ContentGroup* answer_bundle = |
(source == cricket::CS_LOCAL ? local_bundle : remote_bundle); |
if (!EnableBundle(*answer_bundle)) { |
@@ -986,6 +989,11 @@ bool WebRtcSession::UpdateSessionState( |
return BadAnswerSdp(source, kEnableBundleFailed, err_desc); |
} |
} |
+ // Only push down the transport description after enabling BUNDLE; we don't |
+ // want to push down a description on a transport about to be destroyed. |
+ if (!PushdownTransportDescription(source, cricket::CA_ANSWER, &td_err)) { |
+ return BadAnswerSdp(source, MakeTdErrorString(td_err), err_desc); |
+ } |
EnableChannels(); |
SetState(STATE_INPROGRESS); |
if (!PushdownMediaDescription(cricket::CA_ANSWER, source, err_desc)) { |