From: Laurent Aimar Date: Sat, 23 Aug 2003 14:51:30 +0000 (+0000) Subject: * input: fixed buffer overflow, add sanity check and big big clean up. X-Git-Tag: 0.7.0~1069 X-Git-Url: http://git.videolan.org/gitweb.cgi/vlc.git/?p=vlc.git;p=vlc.git;a=commitdiff_plain;h=199aac88b9b0227402f9689c0e2b24324d98271c;hp=fc16dcf87cb2c3d24338679396a63051f95c031c * input: fixed buffer overflow, add sanity check and big big clean up. (for the user filter part). For now, when a user filter can't be inserted it is just ignored. (before the whole audio chain failed). --- diff --git a/src/audio_output/input.c b/src/audio_output/input.c index 3352acbee0..d27edf8d4b 100644 --- a/src/audio_output/input.c +++ b/src/audio_output/input.c @@ -2,7 +2,7 @@ * input.c : internal management of input streams for the audio output ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: input.c,v 1.36 2003/08/19 21:20:00 zorglub Exp $ + * $Id: input.c,v 1.37 2003/08/23 14:51:30 fenrir Exp $ * * Authors: Christophe Massiot * @@ -36,14 +36,6 @@ #include "audio_output.h" #include "aout_internal.h" -typedef struct user_filter_t -{ - char *psz_name; - aout_filter_t * p_filter; - audio_sample_format_t filter_inter_format; - struct user_filter_t *p_next; -} user_filter_t; - /***************************************************************************** * aout_InputNew : allocate a new input and rework the filter pipeline @@ -51,19 +43,9 @@ typedef struct user_filter_t int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input ) { audio_sample_format_t intermediate_format; -#if 0 - headphone_intermediate_format; - aout_filter_t * p_headphone_filter; - vlc_bool_t b_use_headphone_filter = VLC_FALSE; -#endif - - vlc_bool_t b_end=VLC_FALSE; - - user_filter_t* p_first_filter=NULL; - user_filter_t* p_current_filter=NULL; - - char * psz_filters, *psz_eof; - + + char * psz_filters; + aout_FormatPrint( p_aout, "input", &p_input->input ); /* Prepare FIFO. */ @@ -75,132 +57,6 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input ) sizeof(audio_sample_format_t) ); intermediate_format.i_rate = p_input->input.i_rate; - - /* Build the list of user filters */ - psz_filters = config_GetPsz( p_aout , "audio-filter" ); - - p_first_filter = (user_filter_t *)malloc( sizeof( user_filter_t ) ); - if( !p_first_filter ) - { - msg_Err( p_aout, "Out of memory" ); - return -1; - } - p_current_filter = p_first_filter; - p_current_filter->p_next = NULL; - memcpy( &p_current_filter->filter_inter_format, - &p_aout->mixer.mixer,sizeof(audio_sample_format_t)); - p_current_filter->filter_inter_format.i_rate= p_input->input.i_rate; - - if(psz_filters != NULL) - { - msg_Dbg(p_aout,"Building list of user filters"); - while(1) - { - psz_eof = strchr( psz_filters , ',' ); - if( !psz_eof ) - { - b_end = VLC_TRUE; - psz_eof = strchr( psz_filters,'\0'); - } - if( psz_eof ) - { - *psz_eof = '\0'; - } - - msg_Dbg(p_aout,"Adding user filter: %s",psz_filters); - - /* Append the new filter to the list */ - p_current_filter->p_next = - (user_filter_t *)malloc(sizeof(user_filter_t)); - if( !p_current_filter->p_next ) - { - msg_Err( p_aout, "Out of memory" ); - return -1; - } - - memcpy( &p_current_filter->p_next->filter_inter_format, - &p_current_filter->filter_inter_format, - sizeof(audio_sample_format_t) ); - - p_current_filter->p_next->filter_inter_format.i_rate = - p_current_filter->filter_inter_format.i_rate; - - p_current_filter->p_next-> - filter_inter_format.i_physical_channels = - p_current_filter->filter_inter_format.i_physical_channels; - - p_current_filter->p_next-> - filter_inter_format.i_original_channels = - p_current_filter->filter_inter_format.i_original_channels; - - p_current_filter->p_next->filter_inter_format.i_bytes_per_frame = - p_current_filter->p_next-> - filter_inter_format.i_bytes_per_frame * - aout_FormatNbChannels(&p_current_filter->p_next-> - filter_inter_format) / - aout_FormatNbChannels( &intermediate_format); - - /* Go to next filter */ - p_current_filter = p_current_filter->p_next; - - p_current_filter->p_next= NULL; - - p_current_filter->psz_name = strdup(psz_filters); - - psz_filters = psz_eof; - - psz_filters++; - - if(!*psz_filters || b_end == VLC_TRUE) - break; - } - } - -#if 0 - /* Headphone filter add-ons. */ - - memcpy( &headphone_intermediate_format, &p_aout->mixer.mixer, - sizeof(audio_sample_format_t) ); - headphone_intermediate_format.i_rate = - p_input->input.i_rate; - if ( config_GetInt( p_aout , "headphone-opt" ) ) - { - /* Do we use heaphone filter ? */ - if ( intermediate_format.i_physical_channels - == ( AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT ) - && ( intermediate_format.i_format != VLC_FOURCC('f','l','3','2') - || intermediate_format.i_format != VLC_FOURCC('f','i','3','2') - ) ) - { - b_use_headphone_filter = VLC_TRUE; - } - } - if ( b_use_headphone_filter == VLC_TRUE ) - { - /* Split the filter pipeline. */ - headphone_intermediate_format.i_physical_channels = - p_input->input.i_physical_channels; - headphone_intermediate_format.i_original_channels = - p_input->input.i_original_channels; - headphone_intermediate_format.i_bytes_per_frame = - headphone_intermediate_format.i_bytes_per_frame - * aout_FormatNbChannels( &headphone_intermediate_format ) - / aout_FormatNbChannels( &intermediate_format ); - } - - /* Create filters. */ - if ( aout_FiltersCreatePipeline( p_aout, p_input->pp_filters, - &p_input->i_nb_filters, &p_input->input, - &intermediate_format ) < 0 ) - { - msg_Err( p_aout, "couldn't set an input pipeline" ); - - aout_FifoDestroy( p_aout, &p_input->fifo ); - p_input->b_error = 1; - - return -1; - } -#endif /* Create filters. */ if ( aout_FiltersCreatePipeline( p_aout, p_input->pp_filters, &p_input->i_nb_filters, @@ -214,114 +70,82 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input ) p_input->b_error = 1; } - if( p_first_filter->p_next) + /* Now add user filters */ + if( ( psz_filters = config_GetPsz( p_aout , "audio-filter" ) ) ) { - msg_Dbg(p_aout,"Searching user filters..."); - p_current_filter = p_first_filter->p_next; - - /* Ok, we now start to get the filters, from the first one */ - while( p_current_filter ) + char *psz_parser = psz_filters; + char *psz_next; + audio_sample_format_t format_in, format_out; + + memcpy( &format_in, &p_aout->mixer.mixer, sizeof( audio_sample_format_t ) ); + memcpy( &format_out,&p_aout->mixer.mixer, sizeof( audio_sample_format_t ) ); + + format_in.i_rate = p_input->input.i_rate; + format_out.i_rate = p_input->input.i_rate; + + while( psz_parser && *psz_parser ) { + aout_filter_t * p_filter; + + if( p_input->i_nb_filters >= AOUT_MAX_FILTERS ) + { + msg_Dbg( p_aout, "max filter reached (%d)", AOUT_MAX_FILTERS ); + break; + } + + while( *psz_parser == ' ' && *psz_parser == ',' ) + { + psz_parser++; + } + if( ( psz_next = strchr( psz_parser , ',' ) ) ) + { + *psz_next++ = '\0'; + } + if( *psz_parser =='\0' ) + { + break; + } + + msg_Dbg( p_aout, "user filter %s", psz_parser ); + /* Create a VLC object */ - p_current_filter->p_filter = vlc_object_create( p_aout, - sizeof(aout_filter_t) ); - if(p_current_filter->p_filter == NULL ) - { - msg_Err( p_aout, "couldn't open the requested filter module" ); - aout_FifoDestroy( p_aout, &p_input->fifo ); - p_input->b_error = 1; - return -1; + p_filter = vlc_object_create( p_aout, sizeof(aout_filter_t) ); + if( p_filter == NULL ) + { + msg_Err( p_aout, "cannot add user filter %s (skipped)", psz_parser ); + psz_parser = psz_next; + continue; } - vlc_object_attach( p_current_filter->p_filter , p_aout ); - memcpy(&p_current_filter->p_filter->input, - &p_current_filter->filter_inter_format, - sizeof(audio_sample_format_t) ); - - if( p_current_filter->p_next) - { - memcpy(&p_current_filter->p_filter->output, - &p_current_filter->p_next->filter_inter_format, - sizeof(audio_sample_format_t) ); - } - else - { - memcpy(&p_current_filter->p_filter->output, - &intermediate_format, - sizeof(audio_sample_format_t) ); - } - p_current_filter->p_filter->p_module = - module_Need(p_current_filter->p_filter,"audio filter", - p_current_filter->psz_name); - if(p_current_filter->p_filter->p_module== NULL ) - { - vlc_object_detach( p_current_filter->p_filter); - vlc_object_destroy( p_current_filter->p_filter); - - msg_Err( p_aout, "couldn't open the requested module" ); - aout_FifoDestroy( p_aout, &p_input->fifo ); - p_input->b_error = 1; - return -1; + + vlc_object_attach( p_filter , p_aout ); + memcpy( &p_filter->input, &format_in, sizeof(audio_sample_format_t) ); + memcpy( &p_filter->output,&format_out,sizeof(audio_sample_format_t) ); + + + p_filter->p_module = + module_Need( p_filter,"audio filter", psz_parser ); + + if( p_filter->p_module== NULL ) + { + msg_Err( p_aout, "cannot add user filter %s (skipped)", psz_parser ); + + vlc_object_detach( p_filter ); + vlc_object_destroy( p_filter ); + psz_parser = psz_next; + continue; + } - /* success */ - p_current_filter->p_filter->b_continuity = VLC_FALSE; - p_input->pp_filters[p_input->i_nb_filters++] = - p_current_filter->p_filter; + p_filter->b_continuity = VLC_FALSE; - /* Go to next */ - p_current_filter = p_current_filter->p_next; - } - } + p_input->pp_filters[p_input->i_nb_filters++] = p_filter; - /* Free the list */ - p_current_filter = p_first_filter; - while (p_current_filter) - { - user_filter_t * p_old_filter = p_current_filter; - p_current_filter = p_current_filter->p_next; - free(p_old_filter); - } - - -#if 0 - /* Headphone filter add-ons. */ - if ( b_use_headphone_filter == VLC_TRUE ) - { - /* create a vlc object */ - p_headphone_filter = vlc_object_create( p_aout - , sizeof(aout_filter_t) ); - if ( p_headphone_filter == NULL ) - { - msg_Err( p_aout, "couldn't open the headphone virtual spatialization module" ); - aout_FifoDestroy( p_aout, &p_input->fifo ); - p_input->b_error = 1; - return -1; + /* next filter if any */ + psz_parser = psz_next; } - vlc_object_attach( p_headphone_filter, p_aout ); - - /* find the headphone filter */ - memcpy( &p_headphone_filter->input, &headphone_intermediate_format - , sizeof(audio_sample_format_t) ); - memcpy( &p_headphone_filter->output, &intermediate_format - , sizeof(audio_sample_format_t) ); - p_headphone_filter->p_module = module_Need( p_headphone_filter, "audio filter" - , "headphone" ); - if ( p_headphone_filter->p_module == NULL ) - { - vlc_object_detach( p_headphone_filter ); - vlc_object_destroy( p_headphone_filter ); + free( psz_filters ); + } - msg_Err( p_aout, "couldn't open the headphone virtual spatialization module" ); - aout_FifoDestroy( p_aout, &p_input->fifo ); - p_input->b_error = 1; - return -1; - } - /* success */ - p_headphone_filter->b_continuity = VLC_FALSE; - p_input->pp_filters[p_input->i_nb_filters++] = p_headphone_filter; - } -#endif - /* Prepare hints for the buffer allocator. */ p_input->input_alloc.i_alloc_type = AOUT_ALLOC_HEAP; p_input->input_alloc.i_bytes_per_sec = -1;