Bug 951770 - Reject invalid WebM/Opus files. r=rillian

Verify WebM CodecDelay matches the pre-skip value in CodecPrivate.
This commit is contained in:
Jan Gerber 2013-12-19 22:19:00 -08:00
parent 3d30e55258
commit c52441d27c
2 changed files with 9 additions and 3 deletions

View File

@ -372,7 +372,7 @@ nsresult WebMReader::ReadMetadata(MediaInfo* aInfo,
mHasAudio = true;
mInfo.mAudio.mHasAudio = true;
mAudioCodec = nestegg_track_codec_id(mContext, track);
mCodecDelay = params.codec_delay;
mCodecDelay = params.codec_delay / NS_PER_USEC;
if (mAudioCodec == NESTEGG_CODEC_VORBIS) {
// Get the Vorbis header data
@ -439,6 +439,12 @@ nsresult WebMReader::ReadMetadata(MediaInfo* aInfo,
return NS_ERROR_FAILURE;
}
if (mCodecDelay != FramesToUsecs(mOpusParser->mPreSkip, mOpusParser->mRate).value()) {
LOG(PR_LOG_DEBUG, ("Values for CodecDelay and PreSkip do not match\n"))
Cleanup();
return NS_ERROR_FAILURE;
}
mInfo.mAudio.mRate = mOpusParser->mRate;
mInfo.mAudio.mChannels = mOpusParser->mChannels;
@ -718,7 +724,7 @@ bool WebMReader::DecodeAudioPacket(nestegg_packet* aPacket, int64_t aOffset)
NS_WARNING("Int overflow converting WebM audio duration");
return false;
}
CheckedInt64 time = startTime - (mCodecDelay / NS_PER_USEC);
CheckedInt64 time = startTime - mCodecDelay;
if (!time.isValid()) {
NS_WARNING("Int overflow shifting tstamp by codec delay");
nestegg_free_packet(aPacket);

View File

@ -215,7 +215,7 @@ private:
// Number of audio frames we've decoded since decoding began at mAudioStartMs.
uint64_t mAudioFrames;
// Number of nanoseconds that must be discarded from the start of the Stream.
// Number of microseconds that must be discarded from the start of the Stream.
uint64_t mCodecDelay;
// Parser state and computed offset-time mappings. Shared by multiple