diff options
author | wolfbeast <mcwerewolf@wolfbeast.com> | 2020-05-07 13:36:54 +0200 |
---|---|---|
committer | wolfbeast <mcwerewolf@wolfbeast.com> | 2020-05-07 13:36:54 +0200 |
commit | c31fe286b915751e2ea3e9d3531442fabcd370fc (patch) | |
tree | c225c0ad7acd90492f05ac4ba7a7ae4465e8b6b5 /dom | |
parent | 7c779d875b20bce3f5b864136e45670801135643 (diff) | |
download | uxp-c31fe286b915751e2ea3e9d3531442fabcd370fc.tar.gz |
Issue #1536 - Part 1: Add timecode checking for the WebM parser
Diffstat (limited to 'dom')
-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 21154ab4bf..0f6b0cd54f 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 bc3de4ba07..858653fc17 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 |