diff options
author | wolfbeast <mcwerewolf@wolfbeast.com> | 2020-05-07 13:36:54 +0200 |
---|---|---|
committer | Moonchild <moonchild@palemoon.org> | 2020-05-20 13:46:53 +0000 |
commit | f358c4dfa98a079816afe53f0449d5f1ce93244c (patch) | |
tree | 41f97646fa9b655879d068a8ee30a7ce41ff81bc /dom/media/webm | |
parent | ad5cb04d711eb5982f44c0537a9a174ab9adc0f2 (diff) | |
download | UXP-f358c4dfa98a079816afe53f0449d5f1ce93244c.tar UXP-f358c4dfa98a079816afe53f0449d5f1ce93244c.tar.gz UXP-f358c4dfa98a079816afe53f0449d5f1ce93244c.tar.lz UXP-f358c4dfa98a079816afe53f0449d5f1ce93244c.tar.xz UXP-f358c4dfa98a079816afe53f0449d5f1ce93244c.zip |
Issue #1536 - Part 1: Add timecode checking for the WebM parser
Diffstat (limited to 'dom/media/webm')
-rw-r--r-- | dom/media/webm/WebMBufferedParser.cpp | 9 | ||||
-rw-r--r-- | dom/media/webm/WebMBufferedParser.h | 4 |
2 files changed, 13 insertions, 0 deletions
diff --git a/dom/media/webm/WebMBufferedParser.cpp b/dom/media/webm/WebMBufferedParser.cpp index 21154ab4b..0f6b0cd54 100644 --- a/dom/media/webm/WebMBufferedParser.cpp +++ b/dom/media/webm/WebMBufferedParser.cpp @@ -113,6 +113,7 @@ bool WebMBufferedParser::Append(const unsigned char* aBuffer, uint32_t aLength, } else { mClusterEndOffset = -1; } + mGotClusterTimecode = false; mState = READ_ELEMENT_ID; break; case BLOCKGROUP_ID: @@ -121,6 +122,11 @@ bool WebMBufferedParser::Append(const unsigned char* aBuffer, uint32_t aLength, case SIMPLEBLOCK_ID: /* FALLTHROUGH */ case BLOCK_ID: + if (!mGotClusterTimecode) { + WEBM_DEBUG("The Timecode element must appear before any Block or " + "SimpleBlock elements in a Cluster"); + return false; + } mBlockSize = mElement.mSize.mValue; mBlockTimecode = 0; mBlockTimecodeLength = BLOCK_TIMECODE_LENGTH; @@ -164,6 +170,7 @@ bool WebMBufferedParser::Append(const unsigned char* aBuffer, uint32_t aLength, break; case READ_TIMECODESCALE: if (!mGotTimecodeScale) { + WEBM_DEBUG("Should get the SegmentInfo first"); return false; } mTimecodeScale = mVInt.mValue; @@ -171,6 +178,7 @@ bool WebMBufferedParser::Append(const unsigned char* aBuffer, uint32_t aLength, break; case READ_CLUSTER_TIMECODE: mClusterTimecode = mVInt.mValue; + mGotClusterTimecode = true; mState = READ_ELEMENT_ID; break; case READ_BLOCK_TIMECODE: @@ -190,6 +198,7 @@ bool WebMBufferedParser::Append(const unsigned char* aBuffer, uint32_t aLength, // Don't insert invalid negative timecodes. if (mBlockTimecode >= 0 || mClusterTimecode >= uint16_t(abs(mBlockTimecode))) { if (!mGotTimecodeScale) { + WEBM_DEBUG("Should get the TimecodeScale first"); return false; } uint64_t absTimecode = mClusterTimecode + mBlockTimecode; diff --git a/dom/media/webm/WebMBufferedParser.h b/dom/media/webm/WebMBufferedParser.h index bc3de4ba0..858653fc1 100644 --- a/dom/media/webm/WebMBufferedParser.h +++ b/dom/media/webm/WebMBufferedParser.h @@ -75,6 +75,7 @@ struct WebMBufferedParser , mSkipBytes(0) , mTimecodeScale(1000000) , mGotTimecodeScale(false) + , mGotClusterTimecode(false) { if (mStartOffset != 0) { mState = FIND_CLUSTER_SYNC; @@ -260,6 +261,9 @@ private: // True if we read the timecode scale from the segment info or have // confirmed that the default value is to be used. bool mGotTimecodeScale; + + // True if we've read the cluster time code. + bool mGotClusterTimecode; }; class WebMBufferedState final |