mkvmuxer: Reject frames if invalid track number is passed.
Reject frames if an invalid track number is passed. Also change sample_muxer to reject files which have Block elements with invalid track numbers. Fixes Issue #659: https://code.google.com/p/webm/issues/detail?id=659 Change-Id: Ie6cf39a409b68bb4d2261f308409ee0c36d5dd8e
This commit is contained in:
19
mkvmuxer.cpp
19
mkvmuxer.cpp
@@ -2276,6 +2276,10 @@ bool Segment::AddFrame(const uint8* frame, uint64 length, uint64 track_number,
|
|||||||
if (timestamp < last_timestamp_)
|
if (timestamp < last_timestamp_)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// Check if the track number is valid.
|
||||||
|
if (!tracks_.GetTrackByNumber(track_number))
|
||||||
|
return false;
|
||||||
|
|
||||||
// If the segment has a video track hold onto audio frames to make sure the
|
// If the segment has a video track hold onto audio frames to make sure the
|
||||||
// audio that is associated with the start time of a video key-frame is
|
// audio that is associated with the start time of a video key-frame is
|
||||||
// muxed into the same cluster.
|
// muxed into the same cluster.
|
||||||
@@ -2335,6 +2339,10 @@ bool Segment::AddFrameWithAdditional(const uint8* frame, uint64 length,
|
|||||||
if (timestamp < last_timestamp_)
|
if (timestamp < last_timestamp_)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// Check if the track number is valid.
|
||||||
|
if (!tracks_.GetTrackByNumber(track_number))
|
||||||
|
return false;
|
||||||
|
|
||||||
// If the segment has a video track hold onto audio frames to make sure the
|
// If the segment has a video track hold onto audio frames to make sure the
|
||||||
// audio that is associated with the start time of a video key-frame is
|
// audio that is associated with the start time of a video key-frame is
|
||||||
// muxed into the same cluster.
|
// muxed into the same cluster.
|
||||||
@@ -2395,6 +2403,10 @@ bool Segment::AddFrameWithDiscardPadding(const uint8* frame, uint64 length,
|
|||||||
if (timestamp < last_timestamp_)
|
if (timestamp < last_timestamp_)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// Check if the track_number is valid.
|
||||||
|
if (!tracks_.GetTrackByNumber(track_number))
|
||||||
|
return false;
|
||||||
|
|
||||||
// If the segment has a video track hold onto audio frames to make sure the
|
// If the segment has a video track hold onto audio frames to make sure the
|
||||||
// audio that is associated with the start time of a video key-frame is
|
// audio that is associated with the start time of a video key-frame is
|
||||||
// muxed into the same cluster.
|
// muxed into the same cluster.
|
||||||
@@ -2455,6 +2467,10 @@ bool Segment::AddMetadata(const uint8* frame, uint64 length,
|
|||||||
if (timestamp_ns < last_timestamp_)
|
if (timestamp_ns < last_timestamp_)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// Check if the track number is valid.
|
||||||
|
if (!tracks_.GetTrackByNumber(track_number))
|
||||||
|
return false;
|
||||||
|
|
||||||
if (!DoNewClusterProcessing(track_number, timestamp_ns, true))
|
if (!DoNewClusterProcessing(track_number, timestamp_ns, true))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -2481,6 +2497,9 @@ bool Segment::AddMetadata(const uint8* frame, uint64 length,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Segment::AddGenericFrame(const Frame* frame) {
|
bool Segment::AddGenericFrame(const Frame* frame) {
|
||||||
|
if (!tracks_.GetTrackByNumber(frame->track_number())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
last_block_duration_ = frame->duration();
|
last_block_duration_ = frame->duration();
|
||||||
if (!tracks_.TrackIsAudio(frame->track_number()) &&
|
if (!tracks_.TrackIsAudio(frame->track_number()) &&
|
||||||
!tracks_.TrackIsVideo(frame->track_number()) && frame->duration() > 0) {
|
!tracks_.TrackIsVideo(frame->track_number()) && frame->duration() > 0) {
|
||||||
|
|||||||
@@ -457,6 +457,14 @@ int main(int argc, char* argv[]) {
|
|||||||
const long long trackNum = block->GetTrackNumber();
|
const long long trackNum = block->GetTrackNumber();
|
||||||
const mkvparser::Track* const parser_track =
|
const mkvparser::Track* const parser_track =
|
||||||
parser_tracks->GetTrackByNumber(static_cast<unsigned long>(trackNum));
|
parser_tracks->GetTrackByNumber(static_cast<unsigned long>(trackNum));
|
||||||
|
|
||||||
|
// When |parser_track| is NULL, it means that the track number in the
|
||||||
|
// Block is invalid (i.e.) the was no TrackEntry corresponding to the
|
||||||
|
// track number. So we reject the file.
|
||||||
|
if (!parser_track) {
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
const long long track_type = parser_track->GetType();
|
const long long track_type = parser_track->GetType();
|
||||||
const long long time_ns = block->GetTime(cluster);
|
const long long time_ns = block->GetTime(cluster);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user