tags 478971 + patch fixed-upstream
thanks

Upon further inspection, this issue is fixed upstream (0.8.6f).
Apparently, when .diffs were made for #478140, the following commit
was missed:

http://trac.videolan.org/vlc/changeset/49a6a08ce9a7518ff1753ba1c68846401e7e74b0

and modules/demux/mp4/libmp4.c was left with an undefined FREENULL. At
runtime, this results in printouts like the following (with vlc -vvv):

[00000001] main private warning: cannot load module
`/usr/lib/vlc/demux/libmp4_plugin.so'
(/usr/lib/vlc/demux/libmp4_plugin.so: undefined symbol: FREENULL)

I attach an updated 404-CVE-2008-1768.diff (for debian/patches) that
seems to fix the problem.

Best regards,
Pier Luigi Pau
diff -Nurad vlc-0.8.6.e.orig/modules/codec/cinepak.c vlc-0.8.6.e/modules/codec/cinepak.c
--- vlc-0.8.6.e.orig/modules/codec/cinepak.c	2008-04-27 15:53:59.000000000 +0200
+++ vlc-0.8.6.e/modules/codec/cinepak.c	2008-04-27 16:04:26.000000000 +0200
@@ -396,7 +416,7 @@
     i_height = GET2BYTES( p_data );
     i_frame_strips = GET2BYTES( p_data );
 
-    if( !i_frame_size || !i_width || !i_height )
+    if( !i_frame_size || !i_width || !i_height || i_width > 0xffff-3 || i_height > 0xffff-3)
     {
         /* Broken header */
         return( -1 );
diff -Nurad vlc-0.8.6.e.orig/modules/demux/mp4/libmp4.c vlc-0.8.6.e/modules/demux/mp4/libmp4.c
--- vlc-0.8.6.e.orig/modules/demux/mp4/libmp4.c	2008-04-27 15:53:59.000000000 +0200
+++ vlc-0.8.6.e/modules/demux/mp4/libmp4.c	2008-04-27 16:16:02.000000000 +0200
@@ -37,6 +37,8 @@
  *  *look* at the code.
  *
  *****************************************************************************/
+#define FREENULL( p ) do { free( p ); p = NULL; } while(0)
+
 #define MP4_BOX_HEADERSIZE( p_box ) \
   ( 8 + ( p_box->i_shortsize == 1 ? 8 : 0 ) \
       + ( p_box->i_type == FOURCC_uuid ? 16 : 0 ) )
@@ -1641,9 +1641,19 @@
     FREE( p_box->data.p_stdp->i_priority )
 }
 
+static void MP4_FreeBox_padb( MP4_Box_t *p_box )
+{
+    FREENULL( p_box->data.p_padb->i_reserved1 );
+    FREENULL( p_box->data.p_padb->i_pad2 );
+    FREENULL( p_box->data.p_padb->i_reserved2 );
+    FREENULL( p_box->data.p_padb->i_pad1 );
+}
+
 static int MP4_ReadBox_padb( stream_t *p_stream, MP4_Box_t *p_box )
 {
+    int code = 0;
     unsigned int i;
+    uint32_t count;
 
     MP4_READBOX_ENTER( MP4_Box_data_padb_t );
 
@@ -1652,19 +1662,21 @@
 
     MP4_GET4BYTES( p_box->data.p_padb->i_sample_count );
 
-    p_box->data.p_padb->i_reserved1 =
-        calloc( sizeof( uint16_t ), ( p_box->data.p_padb->i_sample_count + 1 ) / 2 );
-    p_box->data.p_padb->i_pad2 =
-        calloc( sizeof( uint16_t ), ( p_box->data.p_padb->i_sample_count + 1 ) / 2 );
-    p_box->data.p_padb->i_reserved2 =
-        calloc( sizeof( uint16_t ), ( p_box->data.p_padb->i_sample_count + 1 ) / 2 );
-    p_box->data.p_padb->i_pad1 =
-        calloc( sizeof( uint16_t ), ( p_box->data.p_padb->i_sample_count + 1 ) / 2 );
+    count = (p_box->data.p_padb->i_sample_count + 1) / 2;
 
+    p_box->data.p_padb->i_reserved1 = calloc( count, sizeof(uint16_t) );
+    p_box->data.p_padb->i_pad2 = calloc( count, sizeof(uint16_t) );
+    p_box->data.p_padb->i_reserved2 = calloc( count, sizeof(uint16_t) );
+    p_box->data.p_padb->i_pad1 = calloc( count, sizeof(uint16_t) );
 
     for( i = 0; i < i_read / 2 ; i++ )
     {
-        p_box->data.p_padb->i_reserved1[i] = ( (*p_peek) >> 7 )&0x01;
+        if( i >= count )
+        {
+            MP4_FreeBox_padb( p_box );
+            goto error;
+        }
+       p_box->data.p_padb->i_reserved1[i] = ( (*p_peek) >> 7 )&0x01;
         p_box->data.p_padb->i_pad2[i] = ( (*p_peek) >> 4 )&0x07;
         p_box->data.p_padb->i_reserved1[i] = ( (*p_peek) >> 3 )&0x01;
         p_box->data.p_padb->i_pad1[i] = ( (*p_peek) )&0x07;
@@ -1677,15 +1689,10 @@
                       i_read / 2 );
 
 #endif
-    MP4_READBOX_EXIT( 1 );
-}
+    code = 1;
 
-static void MP4_FreeBox_padb( MP4_Box_t *p_box )
-{
-    FREE( p_box->data.p_padb->i_reserved1 );
-    FREE( p_box->data.p_padb->i_pad2 );
-    FREE( p_box->data.p_padb->i_reserved2 );
-    FREE( p_box->data.p_padb->i_pad1 );
+error:
+    MP4_READBOX_EXIT( code );
 }
 
 static int MP4_ReadBox_elst( stream_t *p_stream, MP4_Box_t *p_box )
diff -Nurad vlc-0.8.6.e.orig/modules/demux/real.c vlc-0.8.6.e/modules/demux/real.c
--- vlc-0.8.6.e.orig/modules/demux/real.c	2008-04-27 15:53:59.000000000 +0200
+++ vlc-0.8.6.e/modules/demux/real.c	2008-04-27 16:06:12.000000000 +0200
@@ -1082,18 +1082,16 @@
                 tk->i_subpackets =
                     i_subpacket_h * i_frame_size / tk->i_subpacket_size;
                 tk->p_subpackets =
-                    malloc( tk->i_subpackets * sizeof(block_t *) );
+                    calloc( tk->i_subpackets, sizeof(block_t *) );
             }
             else if( fmt.i_codec == VLC_FOURCC('2','8','_','8') )
             {
                 tk->i_subpackets =
                     i_subpacket_h * i_frame_size / tk->i_coded_frame_size;
                 tk->p_subpackets =
-                    malloc( tk->i_subpackets * sizeof(block_t *) );
+                    calloc( tk->i_subpackets, sizeof(block_t *) );
             }
 
-            for( i = 0; i < tk->i_subpackets; i++ ) tk->p_subpackets[i] = NULL;
-
             tk->p_es = es_out_Add( p_demux->out, &fmt );
 
             TAB_APPEND( p_sys->i_track, p_sys->track, tk );

Reply via email to