[vlc-commits] adpcm: do not abuse fmt_in.p_extra, fix double free

Rémi Denis-Courmont git at videolan.org
Sat Jun 6 17:34:31 CEST 2015


vlc/vlc-2.2 | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Jun  6 18:20:12 2015 +0300| [0fce8a54b43d7ba42960d94c71f6a7caa87e4af4] | committer: Rémi Denis-Courmont

adpcm: do not abuse fmt_in.p_extra, fix double free

(cherry picked from commit 85a205b487c0dce7257d42c7e5046f48745a5030)

> http://git.videolan.org/gitweb.cgi/vlc/vlc-2.2.git/?a=commit;h=0fce8a54b43d7ba42960d94c71f6a7caa87e4af4
---

 modules/codec/adpcm.c |   19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/modules/codec/adpcm.c b/modules/codec/adpcm.c
index b052965..e655c45 100644
--- a/modules/codec/adpcm.c
+++ b/modules/codec/adpcm.c
@@ -72,6 +72,7 @@ struct decoder_sys_t
     size_t              i_samplesperblock;
 
     date_t              end_date;
+    int16_t            *prev;
 };
 
 static void DecodeAdpcmMs    ( decoder_t *, int16_t *, uint8_t * );
@@ -164,10 +165,12 @@ static int OpenDecoder( vlc_object_t *p_this )
     }
 
     /* Allocate the memory needed to store the decoder's structure */
-    if( ( p_dec->p_sys = p_sys =
-          (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
+    p_sys = malloc(sizeof(*p_sys));
+    if( unlikely(p_sys == NULL) )
         return VLC_ENOMEM;
 
+    p_sys->prev = NULL;
+
     switch( p_dec->fmt_in.i_codec )
     {
         case VLC_FOURCC('i','m','a', '4'): /* IMA ADPCM */
@@ -187,9 +190,9 @@ static int OpenDecoder( vlc_object_t *p_this )
             break;
         case VLC_FOURCC('X','A','J', 0): /* EA ADPCM */
             p_sys->codec = ADPCM_EA;
-            p_dec->fmt_in.p_extra = calloc( 2 * p_dec->fmt_in.audio.i_channels,
-                                            sizeof( int16_t ) );
-            if( p_dec->fmt_in.p_extra == NULL )
+            p_sys->prev = calloc( 2 * p_dec->fmt_in.audio.i_channels,
+                                  sizeof( int16_t ) );
+            if( unlikely(p_sys->prev == NULL) )
             {
                 free( p_sys );
                 return VLC_ENOMEM;
@@ -245,6 +248,7 @@ static int OpenDecoder( vlc_object_t *p_this )
              p_dec->fmt_in.audio.i_bitspersample, p_sys->i_block,
              p_sys->i_samplesperblock );
 
+    p_dec->p_sys = p_sys;
     p_dec->fmt_out.i_cat = AUDIO_ES;
     p_dec->fmt_out.i_codec = VLC_CODEC_S16N;
     p_dec->fmt_out.audio.i_rate = p_dec->fmt_in.audio.i_rate;
@@ -349,8 +353,7 @@ static void CloseDecoder( vlc_object_t *p_this )
     decoder_t *p_dec = (decoder_t *)p_this;
     decoder_sys_t *p_sys = p_dec->p_sys;
 
-    if( p_sys->codec == ADPCM_EA )
-        free( p_dec->fmt_in.p_extra );
+    free( p_sys->prev );
     free( p_sys );
 }
 
@@ -741,7 +744,7 @@ static void DecodeAdpcmEA( decoder_t *p_dec, int16_t *p_sample,
 
     unsigned chans = p_dec->fmt_in.audio.i_channels;
     const uint8_t *p_end = &p_buffer[p_sys->i_block];
-    int16_t *prev = (int16_t *)p_dec->fmt_in.p_extra;
+    int16_t *prev = p_sys->prev;
     int16_t *cur = prev + chans;
 
     for (unsigned c = 0; c < chans; c++)



More information about the vlc-commits mailing list