From 184f4a9578e2176ab408d4a98387a234c672186f Mon Sep 17 00:00:00 2001 From: "Byron Campen [:bwc]" Date: Mon, 4 Dec 2017 12:57:26 -0600 Subject: [PATCH] Bug 1421965: Avoid nullptr crash when conduits cannot be created. r=drno MozReview-Commit-ID: AdWiIbpFP0Y --HG-- extra : rebase_source : 5e2327f1ddf2249ba0f55c5dcbb4acdf49b65133 --- .../peerconnection/PeerConnectionMedia.cpp | 4 ++++ .../src/peerconnection/TransceiverImpl.cpp | 20 +++++++++++++++++++ .../src/peerconnection/TransceiverImpl.h | 5 +++++ 3 files changed, 29 insertions(+) diff --git a/media/webrtc/signaling/src/peerconnection/PeerConnectionMedia.cpp b/media/webrtc/signaling/src/peerconnection/PeerConnectionMedia.cpp index 0e3285430e53..b1a734a4f7fe 100644 --- a/media/webrtc/signaling/src/peerconnection/PeerConnectionMedia.cpp +++ b/media/webrtc/signaling/src/peerconnection/PeerConnectionMedia.cpp @@ -1148,6 +1148,10 @@ PeerConnectionMedia::AddTransceiver( aSendTrack, mCall.get()); + if (!transceiver->IsValid()) { + return NS_ERROR_FAILURE; + } + if (aSendTrack) { // implement checking for peerIdentity (where failure == black/silence) nsIDocument* doc = mParent->GetWindow()->GetExtantDoc(); diff --git a/media/webrtc/signaling/src/peerconnection/TransceiverImpl.cpp b/media/webrtc/signaling/src/peerconnection/TransceiverImpl.cpp index 4d1e01f331c1..e4ccb2e26023 100644 --- a/media/webrtc/signaling/src/peerconnection/TransceiverImpl.cpp +++ b/media/webrtc/signaling/src/peerconnection/TransceiverImpl.cpp @@ -56,6 +56,10 @@ TransceiverImpl::TransceiverImpl( InitAudio(); } + if (!IsValid()) { + return; + } + mConduit->SetPCHandle(mPCHandle); StartReceiveStream(); @@ -78,6 +82,14 @@ TransceiverImpl::InitAudio() { mConduit = AudioSessionConduit::Create(); + if (!mConduit) { + MOZ_MTLOG(ML_ERROR, mPCHandle << "[" << mMid << "]: " << __FUNCTION__ << + ": Failed to create AudioSessionConduit"); + // TODO(bug 1422897): We need a way to record this when it happens in the + // wild. + return; + } + mReceivePipeline = new MediaPipelineReceiveAudio( mPCHandle, mMainThread.get(), @@ -91,6 +103,14 @@ TransceiverImpl::InitVideo() { mConduit = VideoSessionConduit::Create(mCallWrapper); + if (!mConduit) { + MOZ_MTLOG(ML_ERROR, mPCHandle << "[" << mMid << "]: " << __FUNCTION__ << + ": Failed to create VideoSessionConduit"); + // TODO(bug 1422897): We need a way to record this when it happens in the + // wild. + return; + } + mReceivePipeline = new MediaPipelineReceiveVideo( mPCHandle, mMainThread.get(), diff --git a/media/webrtc/signaling/src/peerconnection/TransceiverImpl.h b/media/webrtc/signaling/src/peerconnection/TransceiverImpl.h index 5ff7a7a5fa3b..806f35ca2507 100644 --- a/media/webrtc/signaling/src/peerconnection/TransceiverImpl.h +++ b/media/webrtc/signaling/src/peerconnection/TransceiverImpl.h @@ -59,6 +59,11 @@ public: dom::MediaStreamTrack* aSendTrack, WebRtcCallWrapper* aCallWrapper); + bool IsValid() const + { + return !!mConduit; + } + nsresult UpdateSendTrack(dom::MediaStreamTrack* aSendTrack); nsresult UpdateSinkIdentity(dom::MediaStreamTrack* aTrack,