Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
f2b070a8 by Steve Lhomme at 2025-08-25T10:07:05+00:00
demux: mkv: use local upper element handling

We don't need to keep the data in the parser.

- - - - -
74407acf by Steve Lhomme at 2025-08-25T10:07:05+00:00
demux: mkv: release upper EBML elements when reading an element in memory

The element is created but we don't use it.

Fixes #29260

- - - - -
30ec4922 by Steve Lhomme at 2025-08-25T10:07:05+00:00
demux: mkv: allow dummy elements inside KaxBlockAdditions

There might be new elements that libmatroska doesn't know about.
It's better to assume they are new elements rather than bogus data.
This is how we read elements in general to be forward compatible.

- - - - -
0fe8906c by Steve Lhomme at 2025-08-25T10:07:05+00:00
demux: mkv: remove unnecessary cast

- - - - -
0fda399a by Steve Lhomme at 2025-08-25T10:07:05+00:00
demux: mkv: use demux_sys_t.b_seekable to check seekability

It's among the first thing we read when opening a Matroska file since 
7663e2adcc8f610bc82e2477e58d2c8150f1fd77.

- - - - -
6a9d6e8e by Steve Lhomme at 2025-08-25T10:07:05+00:00
demux: mkv: factorize code to read a whole master element

- - - - -


3 changed files:

- modules/demux/mkv/matroska_segment.cpp
- modules/demux/mkv/matroska_segment.hpp
- modules/demux/mkv/matroska_segment_parse.cpp


Changes:

=====================================
modules/demux/mkv/matroska_segment.cpp
=====================================
@@ -340,23 +340,8 @@ done:
 
 void matroska_segment_c::LoadTags( KaxTags *tags_ )
 {
-    /* Master elements */
-    if( unlikely( tags_->IsFiniteSize() && tags_->GetSize() >= SIZE_MAX ) )
-    {
-        msg_Err( &sys.demuxer, "Tags too big, aborting" );
-        return;
-    }
-    try
-    {
-        EbmlElement *el;
-        int i_upper_level = 0;
-        tags_->Read( es, EBML_CONTEXT(tags_), i_upper_level, el, true );
-    }
-    catch(...)
-    {
-        msg_Err( &sys.demuxer, "Couldn't read tags" );
+    if ( !ReadMaster( *tags_ ) )
         return;
-    }
 
     struct TagsHandlerPayload
     {
@@ -1293,14 +1278,11 @@ int matroska_segment_c::BlockGet( KaxBlock * & 
pp_block, KaxSimpleBlock * & pp_s
         }
         E_CASE( KaxBlockAdditions, kadditions )
         {
-            EbmlElement *el;
-            int i_upper_level = 0;
-            try
+            if ( vars.obj->ReadMaster( kadditions ) )
             {
-                kadditions.Read( vars.obj->es, EBML_CONTEXT(&kadditions), 
i_upper_level, el, false );
                 vars.additions = &kadditions;
                 vars.ep->Keep ();
-            } catch (...) {}
+            }
         }
         E_CASE( KaxBlockDuration, kduration )
         {


=====================================
modules/demux/mkv/matroska_segment.hpp
=====================================
@@ -160,6 +160,34 @@ public:
 
     bool SameFamily( const matroska_segment_c & of_segment ) const;
 
+    // read a whole EBML master element at once
+    bool ReadMaster(EbmlMaster & m, ScopeMode scope = SCOPE_ALL_DATA)
+    {
+        if( unlikely( m.IsFiniteSize() && m.GetSize() >= SIZE_MAX ) )
+        {
+            msg_Err( VLC_OBJECT(&sys.demuxer), "%s too big, aborting", 
EBML_NAME(&m) );
+            return false;
+        }
+        try
+        {
+            EbmlElement *el;
+            int i_upper_level = 0;
+            m.Read( es, EBML_CONTEXT(&m), i_upper_level, el, true, scope );
+            if (i_upper_level != 0)
+            {
+                assert(el != nullptr);
+                delete el;
+            }
+        }
+        catch(...)
+        {
+            msg_Err( VLC_OBJECT(&sys.demuxer), "Couldn't read %s", 
EBML_NAME(&m) );
+            return false;
+        }
+
+        return true;
+    }
+
 private:
     void LoadCues( KaxCues *cues );
     void LoadTags( KaxTags *tags );


=====================================
modules/demux/mkv/matroska_segment_parse.cpp
=====================================
@@ -1113,24 +1113,9 @@ void matroska_segment_c::ParseTrackEntry( const 
KaxTrackEntry *m )
  *****************************************************************************/
 void matroska_segment_c::ParseTracks( KaxTracks *tracks )
 {
-    EbmlElement *el;
-    int i_upper_level = 0;
-
     /* Master elements */
-    if( unlikely( tracks->IsFiniteSize() && tracks->GetSize() >= SIZE_MAX ) )
-    {
-        msg_Err( &sys.demuxer, "Track too big, aborting" );
+    if ( !ReadMaster( *tracks ) )
         return;
-    }
-    try
-    {
-        tracks->Read( es, EBML_CONTEXT(tracks), i_upper_level, el, true );
-    }
-    catch(...)
-    {
-        msg_Err( &sys.demuxer, "Couldn't read tracks" );
-        return;
-    }
 
     struct Capture {
       matroska_segment_c * obj;
@@ -1168,36 +1153,18 @@ void matroska_segment_c::ParseTracks( KaxTracks *tracks 
)
  *****************************************************************************/
 void matroska_segment_c::ParseInfo( KaxInfo *info )
 {
-    EbmlElement *el;
-    EbmlMaster  *m;
-    int i_upper_level = 0;
+    EbmlMaster  *m = info;
 
-    /* Master elements */
-    m = static_cast<EbmlMaster *>(info);
-    if( unlikely( m->IsFiniteSize() && m->GetSize() >= SIZE_MAX ) )
-    {
-        msg_Err( &sys.demuxer, "Info too big, aborting" );
-        return;
-    }
-    try
-    {
-        m->Read( es, EBML_CONTEXT(info), i_upper_level, el, true );
-    }
-    catch(...)
-    {
-        msg_Err( &sys.demuxer, "Couldn't read info" );
+    if ( !ReadMaster( *info ) )
         return;
-    }
 
     struct InfoHandlerPayload {
         demux_t            * p_demuxer;
         matroska_segment_c * obj;
-        EbmlElement       *&  el;
         EbmlMaster        *&   m;
         double             f_duration;
-        int& i_upper_level;
 
-    } captures = { &sys.demuxer, this, el, m, -1., i_upper_level };
+    } captures = { &sys.demuxer, this, m, -1. };
 
     MKV_SWITCH_CREATE(EbmlTypeDispatcher, InfoHandlers, InfoHandlerPayload)
     {
@@ -1305,13 +1272,8 @@ void matroska_segment_c::ParseInfo( KaxInfo *info )
             };
             try
             {
-                if( unlikely( trans.IsFiniteSize() && trans.GetSize() >= 
SIZE_MAX ) )
-                {
-                    msg_Err( vars.p_demuxer, "Chapter translate too big, 
aborting" );
+                if ( !vars.obj->ReadMaster( trans ) )
                     return;
-                }
-
-                trans.Read( vars.obj->es, EBML_CONTEXT(&trans), 
vars.i_upper_level, vars.el, true );
 
                 chapter_translation_c *p_translate = new 
chapter_translation_c();
 
@@ -1512,23 +1474,8 @@ void matroska_segment_c::ParseChapterAtom( int i_level, 
KaxChapterAtom *ca, chap
  *****************************************************************************/
 void matroska_segment_c::ParseAttachments( KaxAttachments *attachments )
 {
-    EbmlElement *el;
-    int i_upper_level = 0;
-
-    if( unlikely( attachments->IsFiniteSize() && attachments->GetSize() >= 
SIZE_MAX ) )
-    {
-        msg_Err( &sys.demuxer, "Attachments too big, aborting" );
-        return;
-    }
-    try
-    {
-        attachments->Read( es, EBML_CONTEXT(attachments), i_upper_level, el, 
true );
-    }
-    catch(...)
-    {
-        msg_Err( &sys.demuxer, "Error while reading attachments" );
+    if ( !ReadMaster( *attachments ))
         return;
-    }
 
     KaxAttached *attachedFile = FindChild<KaxAttached>( *attachments );
 
@@ -1575,22 +1522,9 @@ void matroska_segment_c::ParseAttachments( 
KaxAttachments *attachments )
  *****************************************************************************/
 void matroska_segment_c::ParseChapters( KaxChapters *chapters )
 {
-    if( unlikely( chapters->IsFiniteSize() && chapters->GetSize() >= SIZE_MAX 
) )
-    {
-        msg_Err( &sys.demuxer, "Chapters too big, aborting" );
-        return;
-    }
-    try
-    {
-        EbmlElement *el;
-        int i_upper_level = 0;
-        chapters->Read( es, EBML_CONTEXT(chapters), i_upper_level, el, true );
-    }
-    catch(...)
-    {
-        msg_Err( &sys.demuxer, "Error while reading chapters" );
+    if ( !ReadMaster( *chapters ) )
         return;
-    }
+
     MKV_SWITCH_CREATE( EbmlTypeDispatcher, KaxChapterHandler, 
matroska_segment_c )
     {
         MKV_SWITCH_INIT();
@@ -1658,30 +1592,12 @@ void matroska_segment_c::ParseChapters( KaxChapters 
*chapters )
 
 bool matroska_segment_c::ParseCluster( KaxCluster *cluster, bool 
b_update_start_time, ScopeMode read_fully )
 {
-    if( unlikely( cluster->IsFiniteSize() && cluster->GetSize() >= SIZE_MAX ) )
-    {
-        msg_Err( &sys.demuxer, "Cluster too big, aborting" );
+    if (!sys.b_seekable)
         return false;
-    }
 
-    bool b_seekable;
-    vlc_stream_Control( sys.demuxer.s, STREAM_CAN_SEEK, &b_seekable );
-    if (!b_seekable)
+    if ( !ReadMaster( *cluster, read_fully ) )
         return false;
 
-    try
-    {
-        EbmlElement *el;
-        int i_upper_level = 0;
-
-        cluster->Read( es, EBML_CONTEXT(cluster), i_upper_level, el, true, 
read_fully );
-    }
-    catch(...)
-    {
-        msg_Err( &sys.demuxer, "Error while reading cluster" );
-        return false;
-    }
-
     bool b_has_timecode = false;
 
     for (auto c : *cluster)



View it on GitLab: 
https://code.videolan.org/videolan/vlc/-/compare/b251b0a7e811bfa0b0550824a8e5e571947afd6c...6a9d6e8e92527853a8c0fde4069411cd0fe07614

-- 
View it on GitLab: 
https://code.videolan.org/videolan/vlc/-/compare/b251b0a7e811bfa0b0550824a8e5e571947afd6c...6a9d6e8e92527853a8c0fde4069411cd0fe07614
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance
_______________________________________________
vlc-commits mailing list
vlc-commits@videolan.org
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to