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",