[vlc-commits] [Git][videolan/vlc][master] 5 commits: demux: mkv: release the p_prev element regardless of the position of Dummy

Felix Paul Kühne (@fkuehne) gitlab at videolan.org
Sat Apr 25 12:18:32 UTC 2026



Felix Paul Kühne pushed to branch master at VideoLAN / VLC


Commits:
5a010d93 by Steve Lhomme at 2026-04-25T14:06:09+02:00
demux: mkv: release the p_prev element regardless of the position of Dummy

Fixes #29539

- - - - -
8a95e7dc by Steve Lhomme at 2026-04-25T14:06:09+02:00
demux: mkv: factorize code to delete previous element on Dummy

- - - - -
063dba28 by Steve Lhomme at 2026-04-25T14:06:09+02:00
demux: mkv: factorize the goto when encountering a dummy element

- - - - -
dd3639c0 by Steve Lhomme at 2026-04-25T14:06:09+02:00
demux: mkv: use a boolean rather than a pointer

We only need to know if we need to return the previous upper level element.
Not need to use a pointer we don't know who should release it.

- - - - -
367e7f07 by Steve Lhomme at 2026-04-25T14:06:09+02:00
demux: mkv: remove always true test

If mi_level = 0 we return early and the level cannot be negative.

- - - - -


2 changed files:

- modules/demux/mkv/Ebml_parser.cpp
- modules/demux/mkv/Ebml_parser.hpp


Changes:

=====================================
modules/demux/mkv/Ebml_parser.cpp
=====================================
@@ -34,7 +34,6 @@ EbmlParser::EbmlParser( matroska_iostream_c *es, EbmlElement *el_start, demux_t
     p_demux( p_demux ),
     m_es( es ),
     mi_level( 1 ),
-    m_got( NULL ),
     mi_user_level( 1 ),
     mb_keep( false ),
     mb_dummy( var_InheritBool( p_demux, "mkv-use-dummy" ) )
@@ -143,10 +142,10 @@ EbmlElement *EbmlParser::Get( bool allow_overshoot )
     {
         return NULL;
     }
-    if( m_got )
+    if( return_previous_parent )
     {
-        EbmlElement *ret = m_got;
-        m_got = NULL;
+        EbmlElement *ret = m_el[mi_level];
+        return_previous_parent = false;
 
         if( mi_level > 0 && m_el[mi_level-1]->IsFiniteSize() && ret->IsFiniteSize() &&
             ret->GetEndPosition() > m_el[mi_level-1]->GetEndPosition() )
@@ -258,8 +257,9 @@ next:
             }
 
             delete m_el[mi_level - 1];
-            m_got = m_el[mi_level -1] = m_el[mi_level];
+            m_el[mi_level -1] = m_el[mi_level];
             m_el[mi_level] = NULL;
+            return_previous_parent = m_el[mi_level - 1] != NULL;
 
             mi_level--;
             i_ulev--;
@@ -293,6 +293,16 @@ next:
             b_bad_position = true;
         }
 
+        if( p_prev )
+        {
+            if( !mb_keep )
+            {
+                delete p_prev;
+                p_prev = NULL;
+            }
+            mb_keep = false;
+        }
+
         if( n_call < M_EL_MAXSIZE && !b_bad_position && m_el[mi_level]->IsFiniteSize() &&
             ( !m_el[mi_level-1]->IsFiniteSize() ||
               m_el[mi_level]->GetEndPosition() <= m_el[mi_level-1]->GetEndPosition() ) )
@@ -300,17 +310,7 @@ next:
             /* The element fits inside its upper element */
             msg_Warn( p_demux, "Dummy element found %" PRIu64 "... skipping it",
                       m_el[mi_level]->GetElementPosition() );
-            if( p_prev )
-            {
-                if( !mb_keep )
-                {
-                    delete p_prev;
-                    p_prev = NULL;
-                }
-                mb_keep = false;
-            }
             n_call++;
-            goto next;
         }
         else
         {
@@ -319,30 +319,21 @@ next:
                      "Dummy element too large or misplaced at %" PRIu64 "... skipping to next upper element",
                      m_el[mi_level]->GetElementPosition() );
 
-            if( mi_level >= 1 &&
-                m_el[mi_level]->IsFiniteSize() && m_el[mi_level-1]->IsFiniteSize() &&
+            if( m_el[mi_level]->IsFiniteSize() && m_el[mi_level-1]->IsFiniteSize() &&
                 m_el[mi_level]->GetElementPosition() >= m_el[mi_level-1]->GetEndPosition() )
             {
                 msg_Err(p_demux, "This element is outside its known parent... upping level");
                 delete m_el[mi_level - 1];
-                m_got = m_el[mi_level -1] = m_el[mi_level];
+                m_el[mi_level -1] = m_el[mi_level];
                 m_el[mi_level] = NULL;
+                return_previous_parent = m_el[mi_level - 1] != NULL;
 
                 mi_level--;
                 return NULL;
             }
-
-            if( p_prev )
-            {
-                if( !mb_keep )
-                {
-                    delete p_prev;
-                    p_prev = NULL;
-                }
-                mb_keep = false;
-            }
-            goto next;
         }
+
+        goto next;
     }
 
     if( p_prev )


=====================================
modules/demux/mkv/Ebml_parser.hpp
=====================================
@@ -59,7 +59,7 @@ class EbmlParser
     size_t       mi_level;
     EbmlElement *m_el[M_EL_MAXSIZE];
 
-    EbmlElement *m_got;
+    bool         return_previous_parent = false;
 
     size_t       mi_user_level;
     bool         mb_keep;



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/f817aa14e54342450696989b3eae8f6c8c736535...367e7f07c206f78b9fdb03b8da1d45001f5278a4

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




More information about the vlc-commits mailing list