Bug 1267637: [vorbis] P4. Reject audio data with unsupported audio configuration. r?gerald draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Wed, 27 Apr 2016 17:43:49 +1000
changeset 356834 b5b02ef1303eb95da953e10c38183290c04f9ffa
parent 356821 5cdc7a3eb26eb2c498d6e3da4da74ba817c37cca
child 356835 052dd4999446095d90b66ce65079a1384809e7ef
push id16612
push userbmo:jyavenard@mozilla.com
push dateWed, 27 Apr 2016 08:16:14 +0000
reviewersgerald
bugs1267637
milestone49.0a1
Bug 1267637: [vorbis] P4. Reject audio data with unsupported audio configuration. r?gerald MozReview-Commit-ID: LS41MX5LwW5
dom/media/platforms/agnostic/VorbisDecoder.cpp
--- a/dom/media/platforms/agnostic/VorbisDecoder.cpp
+++ b/dom/media/platforms/agnostic/VorbisDecoder.cpp
@@ -100,16 +100,21 @@ VorbisDataDecoder::Init()
     LOG(LogLevel::Warning,
         ("Invalid Vorbis header: container and codec rate do not match!"));
   }
   if (mInfo.mChannels != (uint32_t)mVorbisDsp.vi->channels) {
     LOG(LogLevel::Warning,
         ("Invalid Vorbis header: container and codec channels do not match!"));
   }
 
+  AudioConfig::ChannelLayout layout(mVorbisDsp.vi->channels);
+  if (!layout.IsValid()) {
+    return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
+  }
+
   return InitPromise::CreateAndResolve(TrackInfo::kAudioTrack, __func__);
 }
 
 nsresult
 VorbisDataDecoder::DecodeHeader(const unsigned char* aData, size_t aLength)
 {
   bool bos = mPacketCount == 0;
   ogg_packet pkt = InitVorbisPacket(aData, aLength, bos, false, 0, mPacketCount++);
@@ -218,16 +223,19 @@ VorbisDataDecoder::DoDecode(MediaRawData
       NS_WARNING("Int overflow adding total_duration and aTstampUsecs");
       return -1;
     };
 
     if (!mAudioConverter) {
       AudioConfig in(AudioConfig::ChannelLayout(channels, VorbisLayout(channels)),
                      rate);
       AudioConfig out(channels, rate);
+      if (!in.IsValid() || !out.IsValid()) {
+       return -1;
+      }
       mAudioConverter = MakeUnique<AudioConverter>(in, out);
     }
     MOZ_ASSERT(mAudioConverter->CanWorkInPlace());
     AudioSampleBuffer data(Move(buffer));
     data = mAudioConverter->Process(Move(data));
 
     aTotalFrames += frames;
     mCallback->Output(new AudioData(aOffset,