From e0d24f7fa7032202c33870e7d988fdf447233c3f Mon Sep 17 00:00:00 2001 From: Anthony Brandon Date: Wed, 24 Jun 2026 17:24:10 +0200 Subject: [PATCH] [Matroska] Skip invalid Elements Some files might have some invalid elements, but most elements might be correct. In this case it would be useful to still parse the correct elements and skip the invalid ones. When an invalid element is encountered we can set the seek position in the file to the (known) end of that Element. Then further elements can be read starting from that position. Signed-off-by: Anthony Brandon --- taglib/matroska/ebml/ebmlmasterelement.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/taglib/matroska/ebml/ebmlmasterelement.cpp b/taglib/matroska/ebml/ebmlmasterelement.cpp index 56afc393..0b38416b 100644 --- a/taglib/matroska/ebml/ebmlmasterelement.cpp +++ b/taglib/matroska/ebml/ebmlmasterelement.cpp @@ -109,16 +109,24 @@ bool EBML::MasterElement::read(File &file, int depth) std::unique_ptr element; while((element = findNextElement(file, maxOffset))) { if(auto master = dynamic_cast(element.get())) { - if(!master->read(file, depth + 1)) - return false; + if(!master->read(file, depth + 1)) { + debug("EBML: Invalid MasterElement"); + continue; + } } else { - if(!element->read(file)) - return false; + if(!element->read(file)) { + debug("EBML: Invalid Element"); + continue; + } } elements.push_back(std::move(element)); } - return file.tell() == maxOffset; + if(file.tell() == maxOffset) { + return true; + } + file.seek(maxOffset); + return false; } bool EBML::MasterElement::read(File &file)