From 4dbce8899a66f90b3ce9e76f58d9badd0bfb61c3 Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Fri, 2 Mar 2007 00:09:14 +0000 Subject: [PATCH] Fixed memory leak with input_ItemClean. --- include/vlc_input.h | 62 ++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/include/vlc_input.h b/include/vlc_input.h index b43ba470c9..8088a3ecef 100644 --- a/include/vlc_input.h +++ b/include/vlc_input.h @@ -97,14 +97,12 @@ struct input_item_t static inline void input_ItemInit( vlc_object_t *p_o, input_item_t *p_i ) { memset( p_i, 0, sizeof(input_item_t) ); - p_i->psz_name = 0; - p_i->psz_uri = 0; - p_i->i_es = 0; - p_i->es = 0; - p_i->i_options = 0; - p_i->ppsz_options = 0; - p_i->i_categories = 0 ; - p_i->pp_categories = 0; + p_i->psz_name = NULL; + p_i->psz_uri = NULL; + TAB_INIT( p_i->i_es, p_i->es ); + TAB_INIT( p_i->i_options, p_i->ppsz_options ); + TAB_INIT( p_i->i_categories, p_i->pp_categories ); + p_i->i_type = ITEM_TYPE_UNKNOWN; p_i->b_fixed_name = VLC_TRUE; @@ -134,6 +132,8 @@ VLC_EXPORT( void, input_ItemAddOptionNoDup,( input_item_t *, const char * ) ); static inline void input_ItemClean( input_item_t *p_i ) { + int i; + free( p_i->psz_name ); free( p_i->psz_uri ); if( p_i->p_stats ) @@ -142,46 +142,44 @@ static inline void input_ItemClean( input_item_t *p_i ) free( p_i->p_stats ); } - if( p_i->p_meta ) vlc_meta_Delete( p_i->p_meta ); + if( p_i->p_meta ) + vlc_meta_Delete( p_i->p_meta ); - while( p_i->i_options ) + for( i = 0; i < p_i->i_options; i++ ) { - p_i->i_options--; - if( p_i->ppsz_options[p_i->i_options] ) - free( p_i->ppsz_options[p_i->i_options] ); - if( !p_i->i_options ) free( p_i->ppsz_options ); + if( p_i->ppsz_options[i] ) + free( p_i->ppsz_options[i] ); } + TAB_CLEAN( p_i->i_options, p_i->ppsz_options ); - while( p_i->i_es ) + for( i = 0; i < p_i->i_es; i++ ) { - p_i->i_es--; - es_format_Clean( p_i->es[p_i->i_es] ); - if( !p_i->i_es ) free( p_i->es ); + es_format_Clean( p_i->es[i] ); + free( p_i->es[i] ); } + TAB_CLEAN( p_i->i_es, p_i->es ); - while( p_i->i_categories ) + for( i = 0; i < p_i->i_categories; i++ ) { - info_category_t *p_category = - p_i->pp_categories[--(p_i->i_categories)]; + info_category_t *p_category = p_i->pp_categories[i]; + int j; - while( p_category->i_infos ) + for( j = 0; j < p_category->i_infos; j++ ) { - p_category->i_infos--; + struct info_t *p_info = p_category->pp_infos[j]; - if( p_category->pp_infos[p_category->i_infos]->psz_name ) - free( p_category->pp_infos[p_category->i_infos]->psz_name); - if( p_category->pp_infos[p_category->i_infos]->psz_value ) - free( p_category->pp_infos[p_category->i_infos]->psz_value ); - free( p_category->pp_infos[p_category->i_infos] ); - - if( !p_category->i_infos ) free( p_category->pp_infos ); + if( p_info->psz_name ) + free( p_info->psz_name); + if( p_info->psz_value ) + free( p_info->psz_value ); + free( p_info ); } + TAB_CLEAN( p_category->i_infos, p_category->pp_infos ); if( p_category->psz_name ) free( p_category->psz_name ); free( p_category ); - - if( !p_i->i_categories ) free( p_i->pp_categories ); } + TAB_CLEAN( p_i->i_categories, p_i->pp_categories ); vlc_mutex_destroy( &p_i->lock ); } -- 2.39.5