diff --git a/ChangeLog b/ChangeLog index 6c638a686..4fbe79f35 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2016-04-09 Moritz Bunkus + + * mkvmerge: bug fix: mkvmerge will no longer abort reading a + Matroska file with a structural error right before the first + cluster. Fixes #1654. + 2016-04-03 Moritz Bunkus * mkvmerge: enhancement: added the muxing date in both local time diff --git a/src/input/r_matroska.cpp b/src/input/r_matroska.cpp index 3b32dfe18..b0ff3c093 100644 --- a/src/input/r_matroska.cpp +++ b/src/input/r_matroska.cpp @@ -1276,11 +1276,13 @@ bool kax_reader_c::read_headers_internal() { // Elements for different levels - auto cluster = std::unique_ptr{}; + auto cluster = std::shared_ptr{}; try { m_es = std::shared_ptr(new EbmlStream(*m_in)); m_in_file = std::make_shared(*m_in); + m_in_file->enable_reporting(!g_identifying); + // Find the EbmlHead element. Must be the first one. EbmlElement *l0 = m_es->FindNextID(EBML_INFO(EbmlHead), 0xFFFFFFFFFFFFFFFFLL); if (!l0) { @@ -1309,39 +1311,33 @@ kax_reader_c::read_headers_internal() { m_in_file->set_segment_end(*l0); // We've got our segment, so let's find the m_tracks - int upper_lvl_el = 0; - m_tc_scale = TIMECODE_SCALE; - EbmlElement *l1 = nullptr; + m_tc_scale = TIMECODE_SCALE; while (m_in->getFilePointer() < m_in_file->get_segment_end()) { + auto l1 = ebml_element_cptr{ m_in_file->read_next_level1_element() }; if (!l1) - l1 = m_es->FindNextElement(EBML_CONTEXT(l0), upper_lvl_el, 0xFFFFFFFFL, true, 1); - - if (!l1 || (0 < upper_lvl_el)) { - delete l1; break; - } - if (Is(l1)) + if (Is(*l1)) m_deferred_l1_positions[dl1t_info].push_back(l1->GetElementPosition()); - else if (Is(l1)) + else if (Is(*l1)) m_deferred_l1_positions[dl1t_tracks].push_back(l1->GetElementPosition()); - else if (Is(l1)) + else if (Is(*l1)) m_deferred_l1_positions[dl1t_attachments].push_back(l1->GetElementPosition()); - else if (Is(l1)) + else if (Is(*l1)) m_deferred_l1_positions[dl1t_chapters].push_back(l1->GetElementPosition()); - else if (Is(l1)) + else if (Is(*l1)) m_deferred_l1_positions[dl1t_tags].push_back(l1->GetElementPosition()); - else if (Is(l1)) + else if (Is(*l1)) handle_seek_head(m_in.get(), l0, l1->GetElementPosition()); - else if (Is(l1)) - cluster.reset(static_cast(l1)); + else if (Is(*l1)) + cluster = std::static_pointer_cast(l1); else l1->SkipData(*m_es, EBML_CONTEXT(l1)); @@ -1349,31 +1345,10 @@ kax_reader_c::read_headers_internal() { if (cluster) // we've found the first cluster, so get out break; - if (!in_parent(l0)) { - delete l1; + if (!in_parent(l0)) break; - } - - if (upper_lvl_el > 0) { - upper_lvl_el--; - if (upper_lvl_el > 0) - break; - delete l1; - l1 = nullptr; - continue; - - } else if (upper_lvl_el < 0) { - upper_lvl_el++; - if (upper_lvl_el < 0) - break; - - } l1->SkipData(*m_es, EBML_CONTEXT(l1)); - delete l1; - l1 = m_es->FindNextElement(EBML_CONTEXT(l0), upper_lvl_el, 0xFFFFFFFFL, true); - if (!l1) - break; } // while (l1) diff --git a/tests/results.txt b/tests/results.txt index 109b083fd..7f331df43 100644 --- a/tests/results.txt +++ b/tests/results.txt @@ -294,7 +294,7 @@ T_445teletext_subs_missing_second_line:ffbf578cd2806634b76d8e4322600c56:passed:2 T_446mkvinfo_output:d79a79c6c267d83604fb5dedfb361220-05d21f5e324d5b02a5f4bc1a44c58e13-a1a990a98a530744fe2f18d2dedcb116-bea802377f7e6f09efdb90a2e0ed11c9:passed:20141216-165433:2.799686224 T_447mkvinfo_rounded_timecodes:1af5a15e4e84818e9f85221fbc621b00-2a3771b863ced8cf1c624a5df5eafadb-7a77f3e6264e1881e42980bbc85a9e1a:passed:20141216-172642:1.712081143 T_448mpeg_ts_with_hevc:6733a551eacab4145ed267bea8a4d75c:passed:20141216-181650:1.133097273 -T_449segfaults_assertions:error-error-04aa38adf31451c85a19f490ca040dd8-e5484c528a96c5f3fd678ea6bd99a8f2-d0c5f7db319baa4adbd3b965f2c505d5-d560ddb71dfdc430be462588ec38e789-error-error-91eca98ea8df1f307644d5d17d8f0f95-36602f6d1d981cd429f54a6a39b023d8-91eca98ea8df1f307644d5d17d8f0f95-e5484c528a96c5f3fd678ea6bd99a8f2-e5484c528a96c5f3fd678ea6bd99a8f2-f89d13bdea53445e67c78c042f7f783e-565d2ce6866560056a2e929279f88e8e-f89d13bdea53445e67c78c042f7f783e:passed:20141219-195127:0.830949441 +T_449segfaults_assertions:error-error-06096bf8b416ae2c869f6bc32e88213a-e5484c528a96c5f3fd678ea6bd99a8f2-d0c5f7db319baa4adbd3b965f2c505d5-d560ddb71dfdc430be462588ec38e789-error-error-91eca98ea8df1f307644d5d17d8f0f95-36602f6d1d981cd429f54a6a39b023d8-91eca98ea8df1f307644d5d17d8f0f95-e5484c528a96c5f3fd678ea6bd99a8f2-e5484c528a96c5f3fd678ea6bd99a8f2-f89d13bdea53445e67c78c042f7f783e-565d2ce6866560056a2e929279f88e8e-f89d13bdea53445e67c78c042f7f783e:passed:20141219-195127:0.830949441 T_450aac_loas_latm_in_mpeg_ts:2e174e28aecb0f318fbfd8e9647dbd3c:passed:20141229-210738:0.515183095 T_451aac_loas_latm_raw:5a2db12f6eea0bcd37a5d524d8c4c91c:passed:20141230-155351:0.589778873 T_452mkvinfo_track_statistics_frame_order:cb9a860b00fd306fe85e2ac3ee698c17-d49ee464e7ea3eefbbc3e3b4707a308a:passed:20141230-182428:1.579605124