Commit 3514a77e authored by Guido Urdaneta's avatar Guido Urdaneta Committed by Commit Bot

Check weak pointers in RTCPeerConnectionHandler::WebRtcSetDescriptionObserverImpl

Bug: 912074
Change-Id: I8ba86751f5d5bf12db51520f985ef0d3dae63ed8
Reviewed-on: https://chromium-review.googlesource.com/c/1411916
Commit-Queue: Guido Urdaneta <guidou@chromium.org>
Reviewed-by: default avatarHenrik Boström <hbos@chromium.org>
Cr-Commit-Position: refs/heads/master@{#622945}
parent efd337fa
...@@ -669,6 +669,7 @@ class RTCPeerConnectionHandler::WebRtcSetDescriptionObserverImpl ...@@ -669,6 +669,7 @@ class RTCPeerConnectionHandler::WebRtcSetDescriptionObserverImpl
} }
if (handler_) { if (handler_) {
// |handler_| can become null after this call.
handler_->OnSignalingChange(states.signaling_state); handler_->OnSignalingChange(states.signaling_state);
// Process the rest of the state changes differently depending on SDP // Process the rest of the state changes differently depending on SDP
...@@ -680,7 +681,7 @@ class RTCPeerConnectionHandler::WebRtcSetDescriptionObserverImpl ...@@ -680,7 +681,7 @@ class RTCPeerConnectionHandler::WebRtcSetDescriptionObserverImpl
ProcessStateChangesUnifiedPlan(std::move(states)); ProcessStateChangesUnifiedPlan(std::move(states));
} }
if (tracker_) { if (tracker_ && handler_) {
tracker_->TrackSessionDescriptionCallback(handler_.get(), action_, tracker_->TrackSessionDescriptionCallback(handler_.get(), action_,
"OnSuccess", ""); "OnSuccess", "");
} }
...@@ -715,6 +716,9 @@ class RTCPeerConnectionHandler::WebRtcSetDescriptionObserverImpl ...@@ -715,6 +716,9 @@ class RTCPeerConnectionHandler::WebRtcSetDescriptionObserverImpl
void ProcessStateChangesPlanB(WebRtcSetDescriptionObserver::States states) { void ProcessStateChangesPlanB(WebRtcSetDescriptionObserver::States states) {
DCHECK_EQ(sdp_semantics_, webrtc::SdpSemantics::kPlanB); DCHECK_EQ(sdp_semantics_, webrtc::SdpSemantics::kPlanB);
if (!handler_)
return;
// Determine which receivers have been removed before processing the // Determine which receivers have been removed before processing the
// removal as to not invalidate the iterator. // removal as to not invalidate the iterator.
std::vector<RTCRtpReceiver*> removed_receivers; std::vector<RTCRtpReceiver*> removed_receivers;
...@@ -726,18 +730,23 @@ class RTCPeerConnectionHandler::WebRtcSetDescriptionObserverImpl ...@@ -726,18 +730,23 @@ class RTCPeerConnectionHandler::WebRtcSetDescriptionObserverImpl
// Process the addition of remote receivers/tracks. // Process the addition of remote receivers/tracks.
for (auto& transceiver_state : states.transceiver_states) { for (auto& transceiver_state : states.transceiver_states) {
if (ReceiverWasAdded(transceiver_state)) { if (handler_ && ReceiverWasAdded(transceiver_state)) {
// |handler_| can become null after this call.
handler_->OnAddReceiverPlanB(transceiver_state.MoveReceiverState()); handler_->OnAddReceiverPlanB(transceiver_state.MoveReceiverState());
} }
} }
// Process the removal of remote receivers/tracks. // Process the removal of remote receivers/tracks.
for (auto* removed_receiver : removed_receivers) { for (auto* removed_receiver : removed_receivers) {
handler_->OnRemoveReceiverPlanB(RTCRtpReceiver::getId( if (handler_) {
removed_receiver->state().webrtc_receiver().get())); // |handler_| can become null after this call.
handler_->OnRemoveReceiverPlanB(RTCRtpReceiver::getId(
removed_receiver->state().webrtc_receiver().get()));
}
} }
} }
bool ReceiverWasAdded(const RtpTransceiverState& transceiver_state) { bool ReceiverWasAdded(const RtpTransceiverState& transceiver_state) {
DCHECK(handler_);
uintptr_t receiver_id = RTCRtpReceiver::getId( uintptr_t receiver_id = RTCRtpReceiver::getId(
transceiver_state.receiver_state()->webrtc_receiver().get()); transceiver_state.receiver_state()->webrtc_receiver().get());
for (const auto& receiver : handler_->rtp_receivers_) { for (const auto& receiver : handler_->rtp_receivers_) {
...@@ -762,9 +771,11 @@ class RTCPeerConnectionHandler::WebRtcSetDescriptionObserverImpl ...@@ -762,9 +771,11 @@ class RTCPeerConnectionHandler::WebRtcSetDescriptionObserverImpl
void ProcessStateChangesUnifiedPlan( void ProcessStateChangesUnifiedPlan(
WebRtcSetDescriptionObserver::States states) { WebRtcSetDescriptionObserver::States states) {
DCHECK_EQ(sdp_semantics_, webrtc::SdpSemantics::kUnifiedPlan); DCHECK_EQ(sdp_semantics_, webrtc::SdpSemantics::kUnifiedPlan);
handler_->OnModifyTransceivers( if (handler_) {
std::move(states.transceiver_states), handler_->OnModifyTransceivers(
action_ == PeerConnectionTracker::ACTION_SET_REMOTE_DESCRIPTION); std::move(states.transceiver_states),
action_ == PeerConnectionTracker::ACTION_SET_REMOTE_DESCRIPTION);
}
} }
base::WeakPtr<RTCPeerConnectionHandler> handler_; base::WeakPtr<RTCPeerConnectionHandler> handler_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment