Bug 1366208: Make sure no empty RefPtr are ever stored. r?gerald draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Fri, 19 May 2017 11:55:16 +0200
changeset 581142 693b5710750ebe95a244e1c928977fb72c7bdca3
parent 581141 69655408b61ed4423dfbb55a51206c0a0120b867
child 581160 2d3f5cc4ed1380528a40c0c160a6a26cd71e114a
push id59779
push userbmo:jyavenard@mozilla.com
push dateFri, 19 May 2017 09:56:32 +0000
reviewersgerald
bugs1366208
milestone55.0a1
Bug 1366208: Make sure no empty RefPtr are ever stored. r?gerald Should any error occurred while checking the tracks, we could end up with a null pointer stored in the list of track demuxers. MozReview-Commit-ID: 13FllESrpbg
dom/media/fmp4/MP4Demuxer.cpp
--- a/dom/media/fmp4/MP4Demuxer.cpp
+++ b/dom/media/fmp4/MP4Demuxer.cpp
@@ -182,17 +182,16 @@ MP4Demuxer::Init()
   if (NS_FAILED(audioTrackCount.Result()) && result == NS_OK) {
     result = Move(audioTrackCount.Result());
   }
   if (NS_FAILED(videoTrackCount.Result()) && result == NS_OK) {
     result = Move(videoTrackCount.Result());
   }
 
   if (audioTrackCount.Ref() != 0) {
-    mAudioDemuxers.SetLength(audioTrackCount.Ref());
     for (size_t i = 0; i < audioTrackCount.Ref(); i++) {
       mp4_demuxer::MP4Metadata::ResultAndTrackInfo info =
         metadata.GetTrackInfo(TrackInfo::kAudioTrack, i);
       if (!info.Ref()) {
         if (MediaPrefs::MediaWarningsAsErrors()) {
           return InitPromise::CreateAndReject(
             MediaResult(NS_ERROR_DOM_MEDIA_DEMUXER_ERR,
                         RESULT_DETAIL("Invalid MP4 audio track (%s)",
@@ -211,23 +210,22 @@ MP4Demuxer::Init()
       mp4_demuxer::MP4Metadata::ResultAndIndice indices =
         metadata.GetTrackIndice(info.Ref()->mTrackId);
       if (!indices.Ref()) {
         if (NS_FAILED(info.Result()) && result == NS_OK) {
           result = Move(indices.Result());
         }
         continue;
       }
-      mAudioDemuxers[i] =
-        new MP4TrackDemuxer(this, Move(info.Ref()), *indices.Ref().get());
+      mAudioDemuxers.AppendElement(
+        new MP4TrackDemuxer(this, Move(info.Ref()), *indices.Ref().get()));
     }
   }
 
   if (videoTrackCount.Ref() != 0) {
-    mVideoDemuxers.SetLength(videoTrackCount.Ref());
     for (size_t i = 0; i < videoTrackCount.Ref(); i++) {
       mp4_demuxer::MP4Metadata::ResultAndTrackInfo info =
         metadata.GetTrackInfo(TrackInfo::kVideoTrack, i);
       if (!info.Ref()) {
         if (MediaPrefs::MediaWarningsAsErrors()) {
           return InitPromise::CreateAndReject(
             MediaResult(NS_ERROR_DOM_MEDIA_DEMUXER_ERR,
                         RESULT_DETAIL("Invalid MP4 video track (%s)",
@@ -246,18 +244,18 @@ MP4Demuxer::Init()
       mp4_demuxer::MP4Metadata::ResultAndIndice indices =
         metadata.GetTrackIndice(info.Ref()->mTrackId);
       if (!indices.Ref()) {
         if (NS_FAILED(info.Result()) && result == NS_OK) {
           result = Move(indices.Result());
         }
         continue;
       }
-      mVideoDemuxers[i] =
-        new MP4TrackDemuxer(this, Move(info.Ref()), *indices.Ref().get());
+      mVideoDemuxers.AppendElement(
+        new MP4TrackDemuxer(this, Move(info.Ref()), *indices.Ref().get()));
     }
   }
 
   mp4_demuxer::MP4Metadata::ResultAndCryptoFile cryptoFile =
     metadata.Crypto();
   if (NS_FAILED(cryptoFile.Result()) && result == NS_OK) {
     result = Move(cryptoFile.Result());
   }