From 99f80c178a8236c18400150fff4d436f127e41b8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sun, 16 Mar 2008 23:22:59 +0200 Subject: [PATCH] Handle all memory errors in MP4 esds --- modules/demux/mp4/libmp4.c | 40 +++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/modules/demux/mp4/libmp4.c b/modules/demux/mp4/libmp4.c index 8dcbf8438c..22c2f90de0 100644 --- a/modules/demux/mp4/libmp4.c +++ b/modules/demux/mp4/libmp4.c @@ -885,12 +885,24 @@ static int MP4_ReadLengthDescriptor( uint8_t **pp_peek, int64_t *i_read ) return( i_len ); } + +static void MP4_FreeBox_esds( MP4_Box_t *p_box ) +{ + FREENULL( p_box->data.p_esds->es_descriptor.psz_URL ); + if( p_box->data.p_esds->es_descriptor.p_decConfigDescr ) + { + FREENULL( p_box->data.p_esds->es_descriptor.p_decConfigDescr->p_decoder_specific_info ); + FREENULL( p_box->data.p_esds->es_descriptor.p_decConfigDescr ); + } +} + static int MP4_ReadBox_esds( stream_t *p_stream, MP4_Box_t *p_box ) { #define es_descriptor p_box->data.p_esds->es_descriptor unsigned int i_len; unsigned int i_flags; unsigned int i_type; + unsigned int code = 0; MP4_READBOX_ENTER( MP4_Box_data_esds_t ); @@ -958,6 +970,11 @@ static int MP4_ReadBox_esds( stream_t *p_stream, MP4_Box_t *p_box ) es_descriptor.p_decConfigDescr = malloc( sizeof( MP4_descriptor_decoder_config_t )); + if( es_descriptor.p_decConfigDescr == NULL ) + { + free( es_descriptor.psz_URL ); + goto error; + } MP4_GET1BYTE( es_descriptor.p_decConfigDescr->i_objectTypeIndication ); MP4_GET1BYTE( i_flags ); @@ -983,24 +1000,21 @@ static int MP4_ReadBox_esds( stream_t *p_stream, MP4_Box_t *p_box ) es_descriptor.p_decConfigDescr->i_decoder_specific_info_len = i_len; es_descriptor.p_decConfigDescr->p_decoder_specific_info = malloc( i_len ); - if( es_descriptor.p_decConfigDescr->p_decoder_specific_info ) - memcpy( es_descriptor.p_decConfigDescr->p_decoder_specific_info, - p_peek, i_len ); + if( es_descriptor.p_decConfigDescr->p_decoder_specific_info == NULL ) + { + MP4_FreeBox_esds( p_box ); + goto error; + } + memcpy( es_descriptor.p_decConfigDescr->p_decoder_specific_info, + p_peek, i_len ); + code = 1; - MP4_READBOX_EXIT( 1 ); +error: + MP4_READBOX_EXIT( code ); #undef es_descriptor } -static void MP4_FreeBox_esds( MP4_Box_t *p_box ) -{ - FREENULL( p_box->data.p_esds->es_descriptor.psz_URL ); - if( p_box->data.p_esds->es_descriptor.p_decConfigDescr ) - { - FREENULL( p_box->data.p_esds->es_descriptor.p_decConfigDescr->p_decoder_specific_info ); - } - FREENULL( p_box->data.p_esds->es_descriptor.p_decConfigDescr ); -} static int MP4_ReadBox_avcC( stream_t *p_stream, MP4_Box_t *p_box ) { -- 2.39.5