[vlc-commits] [Git][videolan/vlc][master] 4 commits: codec: dvbsub: use realloc_or_free

Steve Lhomme (@robUx4) gitlab at videolan.org
Sun May 3 10:20:17 UTC 2026



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
f13cf841 by François Cartegnie at 2026-05-03T10:02:27+00:00
codec: dvbsub: use realloc_or_free

- - - - -
3c224e06 by François Cartegnie at 2026-05-03T10:02:27+00:00
codec: dvbsub: fix potential invalid deref after failed alloc

- - - - -
d5fb042e by François Cartegnie at 2026-05-03T10:02:27+00:00
codec: dvbsub: prealloc object_defs / remove xrealloc

- - - - -
ac4ed0e6 by François Cartegnie at 2026-05-03T10:02:27+00:00
codec: dvbsub: replace xrealloc

- - - - -


1 changed file:

- modules/codec/dvbsub.c


Changes:

=====================================
modules/codec/dvbsub.c
=====================================
@@ -75,6 +75,7 @@
 #include <vlc_plugin.h>
 #include <vlc_codec.h>
 #include <vlc_sout.h>
+#include <vlc_arrays.h>
 
 #include <vlc_bits.h>
 
@@ -858,14 +859,15 @@ static void decode_page_composition( decoder_t *p_dec, bs_t *s, uint16_t i_segme
     p_sys->b_page = true;
 
     /* Number of regions */
-    p_sys->p_page->i_region_defs = (i_segment_length - 2) / 6;
+    uint16_t i_region_defs = (i_segment_length - 2) / 6;
 
-    if( p_sys->p_page->i_region_defs == 0 ) return;
+    if( i_region_defs == 0 ) return;
 
     p_sys->p_page->p_region_defs =
-        vlc_alloc( p_sys->p_page->i_region_defs, sizeof(dvbsub_regiondef_t) );
+        vlc_alloc( i_region_defs, sizeof(dvbsub_regiondef_t) );
     if( p_sys->p_page->p_region_defs )
     {
+        p_sys->p_page->i_region_defs = i_region_defs;
         for( i = 0; i < p_sys->p_page->i_region_defs; i++ )
         {
             p_sys->p_page->p_region_defs[i].i_id = bs_read( s, 8 );
@@ -958,17 +960,17 @@ static void decode_region_composition( decoder_t *p_dec, bs_t *s, uint16_t i_seg
         {
             msg_Dbg( p_dec, "region size changed (%dx%d->%dx%d)",
                      p_region->i_width, p_region->i_height, i_width, i_height );
-            free( p_region->p_pixbuf );
         }
 
         size_t i_alloc;
         if( ckd_mul( &i_alloc, i_width, i_height ) )
         {
+            free( p_region->p_pixbuf );
             p_region->p_pixbuf = NULL;
         }
         else
         {
-            p_region->p_pixbuf = malloc( i_alloc );
+            p_region->p_pixbuf = realloc_or_free( p_region->p_pixbuf, i_alloc );
             p_region->i_depth = 0;
         }
 
@@ -999,17 +1001,25 @@ static void decode_region_composition( decoder_t *p_dec, bs_t *s, uint16_t i_seg
 
     /* List of objects in the region */
     i_processed_length = 10;
+
+    /* Entry can be 6 or 8 bytes */
+    unsigned max_object_defs;
+    if( i_segment_length < 10 )
+        max_object_defs = 0;
+    else
+        max_object_defs = (i_segment_length - i_processed_length) / 6;
+    p_region->i_object_defs = 0;
+    p_region->p_object_defs = realloc_or_free( p_region->p_object_defs,
+                                               max_object_defs * sizeof(dvbsub_objectdef_t) );
+    if( !p_region->p_object_defs )
+        return;
+
     while( i_processed_length < i_segment_length )
     {
         dvbsub_objectdef_t *p_obj;
 
-        /* We create a new object */
-        p_region->i_object_defs++;
-        p_region->p_object_defs = xrealloc( p_region->p_object_defs,
-                     sizeof(dvbsub_objectdef_t) * p_region->i_object_defs );
-
         /* We parse object properties */
-        p_obj = &p_region->p_object_defs[p_region->i_object_defs - 1];
+        p_obj = &p_region->p_object_defs[p_region->i_object_defs++];
         p_obj->i_id         = bs_read( s, 16 );
         p_obj->i_type       = bs_read( s, 2 );
         bs_skip( s, 2 ); /* Provider */
@@ -1341,17 +1351,21 @@ static void decode_object( decoder_t *p_dec, bs_t *s, uint16_t i_segment_length
 
                 if( p_region->p_object_defs[i].i_id != i_id ) continue;
 
-                p_region->p_object_defs[i].psz_text =
-                    xrealloc( p_region->p_object_defs[i].psz_text,
-                             i_number_of_codes + 1 );
+                char *psz_text = p_region->p_object_defs[i].psz_text;
+
+                p_region->p_object_defs[i].psz_text = psz_text =
+                        realloc_or_free( psz_text, i_number_of_codes + 1 );
+
+                if( !psz_text )
+                    continue;
 
                 /* FIXME 16bits -> char ??? See Preamble */
                 for( j = 0; j < i_number_of_codes; j++ )
                 {
-                    p_region->p_object_defs[i].psz_text[j] = (char)(bs_read( s, 16 ) & 0xFF);
+                    psz_text[j] = (char)(bs_read( s, 16 ) & 0xFF);
                 }
                 /* Null terminate the string */
-                p_region->p_object_defs[i].psz_text[j] = 0;
+                psz_text[j] = 0;
             }
         }
     }



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/7b9ac8a3b81e33645562c0260b9c8a94e8e4a994...ac4ed0e63142ec9864712a0ba2847433fb5d6fb5

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




More information about the vlc-commits mailing list