Bug 1332845 - Remove direct listeners before ending track in TrackUnionStream. r?jesup draft
authorAndreas Pehrson <pehrsons@gmail.com>
Fri, 07 Apr 2017 17:35:26 +0200
changeset 558401 67859512eac79047a63f4ad9ceff94fda3970f28
parent 558400 7f1f36e5fe6586d7f299d98b812883b51d6a7a58
child 623201 621cb53f936f8f18d5cbe5d94e088670193a58d0
push id52879
push userbmo:pehrson@telenordigital.com
push dateFri, 07 Apr 2017 15:51:40 +0000
reviewersjesup
bugs1332845
milestone55.0a1
Bug 1332845 - Remove direct listeners before ending track in TrackUnionStream. r?jesup There was a race where ending the track before removing the direct listener here, allowed the source to append more data (notifying the direct listener) after the consumer had been notified of the ending track. MozReview-Commit-ID: E08UeMNQhGx
dom/media/TrackUnionStream.cpp
--- a/dom/media/TrackUnionStream.cpp
+++ b/dom/media/TrackUnionStream.cpp
@@ -52,23 +52,23 @@ TrackUnionStream::TrackUnionStream(Abstr
 }
 
   void TrackUnionStream::RemoveInput(MediaInputPort* aPort)
   {
     STREAM_LOG(LogLevel::Debug, ("TrackUnionStream %p removing input %p", this, aPort));
     for (int32_t i = mTrackMap.Length() - 1; i >= 0; --i) {
       if (mTrackMap[i].mInputPort == aPort) {
         STREAM_LOG(LogLevel::Debug, ("TrackUnionStream %p removing trackmap entry %d", this, i));
-        EndTrack(i);
         nsTArray<RefPtr<DirectMediaStreamTrackListener>> listeners(
           mTrackMap[i].mOwnedDirectListeners);
         for (auto listener : listeners) {
           // Remove listeners while the entry still exists.
           RemoveDirectTrackListenerImpl(listener, mTrackMap[i].mOutputTrackID);
         }
+        EndTrack(i);
         mTrackMap.RemoveElementAt(i);
       }
     }
     ProcessedMediaStream::RemoveInput(aPort);
   }
   void TrackUnionStream::ProcessInput(GraphTime aFrom, GraphTime aTo, uint32_t aFlags)
   {
     if (IsFinishedOnGraphThread()) {