Merge changes I7e467d31,Ia8633cab
* changes:
Add test for projection parse failures.
Add test for primary chromaticity parse failures.
diff --git a/.gitattributes b/.gitattributes
index 6394064..2b5cda5 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -2,3 +2,5 @@
*.vcproj eol=crlf
*.vsprops eol=crlf
*.vcxproj eol=crlf
+*.mkv -text -diff
+*.webm -text -diff
diff --git a/common/vp9_header_parser_tests.cc b/common/vp9_header_parser_tests.cc
index c4610b9..1e8eceb 100644
--- a/common/vp9_header_parser_tests.cc
+++ b/common/vp9_header_parser_tests.cc
@@ -59,7 +59,19 @@
CreateAndLoadSegment(filename, 4);
}
- void ProcessTheFrames() {
+ // Load a corrupted segment with no expectation of correctness.
+ void CreateAndLoadInvalidSegment(const std::string& filename) {
+ filename_ = test::GetTestFilePath(filename);
+ ASSERT_EQ(0, reader_.Open(filename_.c_str()));
+ is_reader_open_ = true;
+ pos_ = 0;
+ mkvparser::EBMLHeader ebml_header;
+ ebml_header.Parse(&reader_, pos_);
+ ASSERT_EQ(0, mkvparser::Segment::CreateInstance(&reader_, pos_, segment_));
+ ASSERT_GE(0, segment_->Load());
+ }
+
+ void ProcessTheFrames(bool invalid_bitstream) {
unsigned char* data = NULL;
size_t data_len = 0;
const mkvparser::Tracks* const parser_tracks = segment_->GetTracks();
@@ -96,7 +108,7 @@
}
ASSERT_FALSE(frame.Read(&reader_, data));
parser_.SetFrame(data, data_len);
- parser_.ParseUncompressedHeader();
+ ASSERT_EQ(parser_.ParseUncompressedHeader(), !invalid_bitstream);
}
}
@@ -119,8 +131,8 @@
};
TEST_F(Vp9HeaderParserTests, VideoOnlyFile) {
- CreateAndLoadSegment("test_stereo_left_right.webm");
- ProcessTheFrames();
+ ASSERT_NO_FATAL_FAILURE(CreateAndLoadSegment("test_stereo_left_right.webm"));
+ ProcessTheFrames(false);
EXPECT_EQ(256, parser_.width());
EXPECT_EQ(144, parser_.height());
EXPECT_EQ(1, parser_.column_tiles());
@@ -128,14 +140,31 @@
}
TEST_F(Vp9HeaderParserTests, Muxed) {
- CreateAndLoadSegment("bbb_480p_vp9_opus_1second.webm", 4);
- ProcessTheFrames();
+ ASSERT_NO_FATAL_FAILURE(
+ CreateAndLoadSegment("bbb_480p_vp9_opus_1second.webm", 4));
+ ProcessTheFrames(false);
EXPECT_EQ(854, parser_.width());
EXPECT_EQ(480, parser_.height());
EXPECT_EQ(2, parser_.column_tiles());
EXPECT_EQ(1, parser_.frame_parallel_mode());
}
+TEST_F(Vp9HeaderParserTests, Invalid) {
+ const char* files[] = {
+ "invalid/invalid_vp9_bitstream-bug_1416.webm",
+ "invalid/invalid_vp9_bitstream-bug_1417.webm",
+ };
+
+ for (int i = 0; i < static_cast<int>(sizeof(files) / sizeof(files[0])); ++i) {
+ SCOPED_TRACE(files[i]);
+ ASSERT_NO_FATAL_FAILURE(CreateAndLoadInvalidSegment(files[i]));
+ ProcessTheFrames(true);
+ CloseReader();
+ delete segment_;
+ segment_ = NULL;
+ }
+}
+
} // namespace
int main(int argc, char* argv[]) {
diff --git a/mkvparser/mkvparser.cc b/mkvparser/mkvparser.cc
index 80814e0..a3995de 100644
--- a/mkvparser/mkvparser.cc
+++ b/mkvparser/mkvparser.cc
@@ -2430,7 +2430,9 @@
}
const CuePoint::TrackPosition* CuePoint::Find(const Track* pTrack) const {
- assert(pTrack);
+ if (pTrack == NULL) {
+ return NULL;
+ }
const long long n = pTrack->GetNumber();
@@ -7936,7 +7938,6 @@
pf = m_frames;
while (pf != pf_end) {
Frame& f = *pf++;
- assert((pos + f.len) <= stop);
if ((pos + f.len) > stop)
return E_FILE_FORMAT_INVALID;
diff --git a/testing/testdata/invalid/invalid_vp9_bitstream-bug_1416.webm b/testing/testdata/invalid/invalid_vp9_bitstream-bug_1416.webm
new file mode 100644
index 0000000..ac76dce
--- /dev/null
+++ b/testing/testdata/invalid/invalid_vp9_bitstream-bug_1416.webm
Binary files differ
diff --git a/testing/testdata/invalid/invalid_vp9_bitstream-bug_1417.webm b/testing/testdata/invalid/invalid_vp9_bitstream-bug_1417.webm
new file mode 100644
index 0000000..0cbd724
--- /dev/null
+++ b/testing/testdata/invalid/invalid_vp9_bitstream-bug_1417.webm
Binary files differ
diff --git a/vttdemux.cc b/vttdemux.cc
index c9abd5c..52a2661 100644
--- a/vttdemux.cc
+++ b/vttdemux.cc
@@ -523,8 +523,10 @@
metadata_map_t::value_type& v = *i++;
MetadataInfo& info = v.second;
- fclose(info.file);
- info.file = NULL;
+ if (info.file != NULL) {
+ fclose(info.file);
+ info.file = NULL;
+ }
}
}
diff --git a/webm_info.cc b/webm_info.cc
index 2f9c00d..1ce6590 100644
--- a/webm_info.cc
+++ b/webm_info.cc
@@ -709,8 +709,15 @@
do {
const size_t frame_length = (count > 0) ? sizes[i] : size;
+ if (frame_length > std::numeric_limits<int>::max() ||
+ static_cast<int>(frame_length) > size) {
+ fprintf(o, " invalid VP9 frame size (%u)\n",
+ static_cast<uint32_t>(frame_length));
+ return;
+ }
parser->SetFrame(data, frame_length);
- parser->ParseUncompressedHeader();
+ if (!parser->ParseUncompressedHeader())
+ return;
level_stats->AddFrame(*parser, time_ns);
// const int frame_marker = (data[0] >> 6) & 0x3;
@@ -1085,8 +1092,8 @@
indent->Adjust(libwebm::kIncreaseIndent);
do {
- for (int track_num = 1; track_num <= num_tracks; ++track_num) {
- const mkvparser::Track* const track = tracks.GetTrackByNumber(track_num);
+ for (int track_num = 0; track_num < num_tracks; ++track_num) {
+ const mkvparser::Track* const track = tracks.GetTrackByIndex(track_num);
const mkvparser::CuePoint::TrackPosition* const track_pos =
cue_point->Find(track);
@@ -1095,7 +1102,7 @@
(track->GetType() == mkvparser::Track::kVideo) ? 'V' : 'A';
fprintf(o, "%sCue Point:%d type:%c track:%d",
indent->indent_str().c_str(), cue_point_num, track_type,
- track_num);
+ static_cast<int>(track->GetNumber()));
if (options.output_seconds) {
fprintf(o, " secs:%g",