X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fasf%2Flibasf.c;h=8453b0f017332b1c3b19762b423bc0cd718d2f42;hb=292040d665436ab386d01cd6f7e33c02d29fcd14;hp=428b233f35d43784f6abc7acea8513de8557fca8;hpb=7f779f6a64eadd10b2e2b98bcf85fdd38c0cdfa5;p=vlc diff --git a/modules/demux/asf/libasf.c b/modules/demux/asf/libasf.c index 428b233f35..8453b0f017 100644 --- a/modules/demux/asf/libasf.c +++ b/modules/demux/asf/libasf.c @@ -22,14 +22,16 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + #include -#include -#include /* malloc(), free() */ -#include +#include -#include "codecs.h" /* BITMAPINFOHEADER, WAVEFORMATEX */ +#include /* BITMAPINFOHEADER, WAVEFORMATEX */ #include "libasf.h" #define ASF_DEBUG 1 @@ -50,7 +52,7 @@ static int ASF_ReadObject( stream_t *, asf_object_t *, asf_object_t * ); /**************************************************************************** * GUID functions ****************************************************************************/ -void ASF_GetGUID( guid_t *p_guid, uint8_t *p_data ) +void ASF_GetGUID( guid_t *p_guid, const uint8_t *p_data ) { p_guid->v1 = GetDWLE( p_data ); p_guid->v2 = GetWLE( p_data + 4); @@ -76,7 +78,7 @@ int ASF_CmpGUID( const guid_t *p_guid1, const guid_t *p_guid2 ) static int ASF_ReadObjectCommon( stream_t *s, asf_object_t *p_obj ) { asf_object_common_t *p_common = (asf_object_common_t*)p_obj; - uint8_t *p_peek; + const uint8_t *p_peek; if( stream_Peek( s, &p_peek, 24 ) < 24 ) { @@ -132,6 +134,7 @@ static int ASF_NextObject( stream_t *s, asf_object_t *p_obj ) static void ASF_FreeObject_Null( asf_object_t *pp_obj ) { + VLC_UNUSED(pp_obj); return; } @@ -140,7 +143,7 @@ static int ASF_ReadObject_Header( stream_t *s, asf_object_t *p_obj ) asf_object_header_t *p_hdr = (asf_object_header_t*)p_obj; asf_object_t *p_subobj; int i_peek; - uint8_t *p_peek; + const uint8_t *p_peek; if( ( i_peek = stream_Peek( s, &p_peek, 30 ) ) < 30 ) { @@ -186,7 +189,7 @@ static int ASF_ReadObject_Data( stream_t *s, asf_object_t *p_obj ) { asf_object_data_t *p_data = (asf_object_data_t*)p_obj; int i_peek; - uint8_t *p_peek; + const uint8_t *p_peek; if( ( i_peek = stream_Peek( s, &p_peek, 50 ) ) < 50 ) { @@ -211,18 +214,21 @@ static int ASF_ReadObject_Data( stream_t *s, asf_object_t *p_obj ) static int ASF_ReadObject_Index( stream_t *s, asf_object_t *p_obj ) { asf_object_index_t *p_index = (asf_object_index_t*)p_obj; - int i_peek; - uint8_t *p_peek; + const uint8_t *p_peek; + int i; - if( ( i_peek = stream_Peek( s, &p_peek, 56 ) ) < 56 ) + if( stream_Peek( s, &p_peek, p_index->i_object_size ) < + (int)p_index->i_object_size ) { - return VLC_EGENERIC; + /* Just ignore */ + return VLC_SUCCESS; } + ASF_GetGUID( &p_index->i_file_id, p_peek + 24 ); p_index->i_index_entry_time_interval = GetQWLE( p_peek + 40 ); p_index->i_max_packet_count = GetDWLE( p_peek + 48 ); p_index->i_index_entry_count = GetDWLE( p_peek + 52 ); - p_index->index_entry = NULL; /* FIXME */ + p_index->index_entry = NULL; #ifdef ASF_DEBUG msg_Dbg( s, @@ -235,6 +241,20 @@ static int ASF_ReadObject_Index( stream_t *s, asf_object_t *p_obj ) (long int)p_index->i_index_entry_count ); #endif + /* Sanity checking */ + if( p_index->i_index_entry_count > (p_index->i_object_size - 56) / 6 ) + p_index->i_index_entry_count = (p_index->i_object_size - 56) / 6; + + p_index->index_entry = malloc( sizeof(asf_index_entry_t) * + p_index->i_index_entry_count ); + + for( i = 0, p_peek += 56; i < (int)p_index->i_index_entry_count; + i++, p_peek += 6 ) + { + p_index->index_entry[i].i_packet_number = GetDWLE( p_peek ); + p_index->index_entry[i].i_packet_count = GetDWLE( p_peek + 4 ); + } + return VLC_SUCCESS; } @@ -248,10 +268,10 @@ static void ASF_FreeObject_Index( asf_object_t *p_obj ) static int ASF_ReadObject_file_properties( stream_t *s, asf_object_t *p_obj ) { asf_object_file_properties_t *p_fp = (asf_object_file_properties_t*)p_obj; - int i_peek; - uint8_t *p_peek; + int i_peek; + const uint8_t *p_peek; - if( ( i_peek = stream_Peek( s, &p_peek, 92) ) < 92 ) + if( ( i_peek = stream_Peek( s, &p_peek, 104 ) ) < 104 ) { return VLC_EGENERIC; } @@ -259,9 +279,10 @@ static int ASF_ReadObject_file_properties( stream_t *s, asf_object_t *p_obj ) p_fp->i_file_size = GetQWLE( p_peek + 40 ); p_fp->i_creation_date = GetQWLE( p_peek + 48 ); p_fp->i_data_packets_count = GetQWLE( p_peek + 56 ); - p_fp->i_play_duration = GetQWLE( p_peek + 64 ); - p_fp->i_send_duration = GetQWLE( p_peek + 72 ); - p_fp->i_preroll = GetQWLE( p_peek + 80 ); + p_fp->i_send_duration = GetQWLE( p_peek + 64 ); + p_fp->i_play_duration = GetQWLE( p_peek + 72 ); + p_fp->i_preroll = GetDWLE( p_peek + 80 ); + p_fp->i_unknown = GetDWLE( p_peek + 84 ); p_fp->i_flags = GetDWLE( p_peek + 88 ); p_fp->i_min_data_packet_size = GetDWLE( p_peek + 92 ); p_fp->i_max_data_packet_size = GetDWLE( p_peek + 96 ); @@ -271,13 +292,13 @@ static int ASF_ReadObject_file_properties( stream_t *s, asf_object_t *p_obj ) msg_Dbg( s, "read \"file properties object\" file_id:" GUID_FMT " file_size:"I64Fd" creation_date:"I64Fd" data_packets_count:" - I64Fd" play_duration:"I64Fd" send_duration:"I64Fd" preroll:" - I64Fd" flags:%d min_data_packet_size:%d max_data_packet_size:%d " - "max_bitrate:%d", + I64Fd" send_duration:"I64Fd" play_duration:"I64Fd" preroll:%d" + "unknown:%d flags:%d min_data_packet_size:%d " + "max_data_packet_size:%d max_bitrate:%d", GUID_PRINT( p_fp->i_file_id ), p_fp->i_file_size, p_fp->i_creation_date, p_fp->i_data_packets_count, - p_fp->i_play_duration, p_fp->i_send_duration, - p_fp->i_preroll, p_fp->i_flags, + p_fp->i_send_duration, p_fp->i_play_duration, + p_fp->i_preroll, p_fp->i_unknown, p_fp->i_flags, p_fp->i_min_data_packet_size, p_fp->i_max_data_packet_size, p_fp->i_max_bitrate ); #endif @@ -305,7 +326,7 @@ static int ASF_ReadObject_metadata( stream_t *s, asf_object_t *p_obj ) (asf_object_metadata_t *)p_obj; int i_peek, i_entries, i; - uint8_t *p_peek; + const uint8_t *p_peek; #ifdef ASF_DEBUG unsigned int j; #endif @@ -427,7 +448,7 @@ static int ASF_ReadObject_header_extension( stream_t *s, asf_object_t *p_obj ) asf_object_header_extension_t *p_he = (asf_object_header_extension_t *)p_obj; int i_peek; - uint8_t *p_peek; + const uint8_t *p_peek; if( ( i_peek = stream_Peek( s, &p_peek, p_he->i_object_size ) ) < 46) { @@ -491,13 +512,14 @@ static int ASF_ReadObject_stream_properties( stream_t *s, asf_object_t *p_obj ) { asf_object_stream_properties_t *p_sp = (asf_object_stream_properties_t*)p_obj; - int i_peek; - uint8_t *p_peek; + size_t i_peek; + const uint8_t *p_peek; - if( ( i_peek = stream_Peek( s, &p_peek, p_sp->i_object_size ) ) < 74 ) + if( ( i_peek = stream_Peek( s, &p_peek, p_sp->i_object_size ) ) < 78 ) { return VLC_EGENERIC; } + ASF_GetGUID( &p_sp->i_stream_type, p_peek + 24 ); ASF_GetGUID( &p_sp->i_error_correction_type, p_peek + 40 ); p_sp->i_time_offset = GetQWLE( p_peek + 56 ); @@ -506,21 +528,42 @@ static int ASF_ReadObject_stream_properties( stream_t *s, asf_object_t *p_obj ) p_sp->i_flags = GetWLE( p_peek + 72 ); p_sp->i_stream_number = p_sp->i_flags&0x07f; p_sp->i_reserved = GetDWLE( p_peek + 74 ); + i_peek -= 78; + if( p_sp->i_type_specific_data_length ) { + if( i_peek < p_sp->i_type_specific_data_length ) + return VLC_EGENERIC; + p_sp->p_type_specific_data = malloc( p_sp->i_type_specific_data_length ); + if( p_sp->p_type_specific_data == NULL ) + return VLC_ENOMEM; + memcpy( p_sp->p_type_specific_data, p_peek + 78, p_sp->i_type_specific_data_length ); + i_peek -= p_sp->i_type_specific_data_length; } else { p_sp->p_type_specific_data = NULL; } + if( p_sp->i_error_correction_data_length ) { + if( i_peek < p_sp->i_error_correction_data_length ) + { + free( p_sp->p_type_specific_data ); + return VLC_EGENERIC; + } + p_sp->p_error_correction_data = malloc( p_sp->i_error_correction_data_length ); + if( p_sp->p_error_correction_data == NULL ) + { + free( p_sp->p_type_specific_data ); + return VLC_ENOMEM; + } memcpy( p_sp->p_error_correction_data, p_peek + 78 + p_sp->i_type_specific_data_length, p_sp->i_error_correction_data_length ); @@ -562,7 +605,7 @@ static int ASF_ReadObject_codec_list( stream_t *s, asf_object_t *p_obj ) { asf_object_codec_list_t *p_cl = (asf_object_codec_list_t*)p_obj; int i_peek; - uint8_t *p_peek, *p_data; + const uint8_t *p_peek, *p_data; unsigned int i_codec; @@ -671,7 +714,7 @@ static int ASF_ReadObject_content_description(stream_t *s, asf_object_t *p_obj) { asf_object_content_description_t *p_cd = (asf_object_content_description_t *)p_obj; - uint8_t *p_peek, *p_data; + const uint8_t *p_peek, *p_data; int i_peek, i_title, i_artist, i_copyright, i_description, i_rating; vlc_iconv_t cd = (vlc_iconv_t)-1; const char *ib = NULL; @@ -745,7 +788,7 @@ static int ASF_ReadObject_language_list(stream_t *s, asf_object_t *p_obj) { asf_object_language_list_t *p_ll = (asf_object_language_list_t*)p_obj; - uint8_t *p_peek, *p_data; + const uint8_t *p_peek, *p_data; int i_peek; int i; @@ -778,10 +821,10 @@ static int ASF_ReadObject_language_list(stream_t *s, asf_object_t *p_obj) } #ifdef ASF_DEBUG - msg_Dbg( s, "read \"language list object\" %d entries", + msg_Dbg( s, "read \"language list object\" %d entries", p_ll->i_language ); for( i = 0; i < p_ll->i_language; i++ ) - msg_Dbg( s, " - '%s'", + msg_Dbg( s, " - '%s'", p_ll->ppsz_language[i] ); #endif return VLC_SUCCESS; @@ -804,7 +847,7 @@ static int ASF_ReadObject_stream_bitrate_properties( stream_t *s, { asf_object_stream_bitrate_properties_t *p_sb = (asf_object_stream_bitrate_properties_t *)p_obj; - uint8_t *p_peek, *p_data; + const uint8_t *p_peek, *p_data; int i_peek; int i; @@ -829,7 +872,7 @@ static int ASF_ReadObject_stream_bitrate_properties( stream_t *s, { msg_Dbg( s," - stream=%d bitrate=%d", p_sb->bitrate[i].i_stream_number, - p_sb->bitrate[i].i_avg_bitrate ); + p_sb->bitrate[i].i_avg_bitrate ); } #endif return VLC_SUCCESS; @@ -843,7 +886,7 @@ static int ASF_ReadObject_extended_stream_properties( stream_t *s, { asf_object_extended_stream_properties_t *p_esp = (asf_object_extended_stream_properties_t*)p_obj; - uint8_t *p_peek, *p_data; + const uint8_t *p_peek, *p_data; int i_peek, i; if( ( i_peek = stream_Peek( s, &p_peek, p_esp->i_object_size ) ) < 88 ) @@ -908,7 +951,7 @@ static int ASF_ReadObject_extended_stream_properties( stream_t *s, asf_object_t *p_sp; /* Cannot fail as peek succeed */ stream_Read( s, NULL, p_data - p_peek ); - + p_sp = malloc( sizeof( asf_object_t ) ); if( ASF_ReadObject( s, p_sp, NULL ) ) @@ -968,7 +1011,7 @@ static int ASF_ReadObject_advanced_mutual_exclusion( stream_t *s, { asf_object_advanced_mutual_exclusion_t *p_ae = (asf_object_advanced_mutual_exclusion_t *)p_obj; - uint8_t *p_peek, *p_data; + const uint8_t *p_peek, *p_data; int i_peek; int i; @@ -988,7 +1031,7 @@ static int ASF_ReadObject_advanced_mutual_exclusion( stream_t *s, p_ae->pi_stream_number[i] = GetWLE( p_data ); p_data += 2; } - + #ifdef ASF_DEBUG msg_Dbg( s, "read \"advanced mutual exclusion object\"" ); for( i = 0; i < p_ae->i_stream_number_count; i++ ) @@ -1010,7 +1053,7 @@ static int ASF_ReadObject_stream_prioritization( stream_t *s, { asf_object_stream_prioritization_t *p_sp = (asf_object_stream_prioritization_t *)p_obj; - uint8_t *p_peek, *p_data; + const uint8_t *p_peek, *p_data; int i_peek; int i; @@ -1055,7 +1098,7 @@ static int ASF_ReadObject_extended_content_description( stream_t *s, { asf_object_extended_content_description_t *p_ec = (asf_object_extended_content_description_t *)p_obj; - uint8_t *p_peek, *p_data; + const uint8_t *p_peek, *p_data; int i_peek; int i; @@ -1128,7 +1171,7 @@ static int ASF_ReadObject_extended_content_description( stream_t *s, p_ec->ppsz_value[i] = NULL; p_data += i_size; - + #undef GETSTRINGW @@ -1155,6 +1198,8 @@ static void ASF_FreeObject_extended_content_description( asf_object_t *p_obj) FREENULL( p_ec->ppsz_name[i] ); FREENULL( p_ec->ppsz_value[i] ); } + FREENULL( p_ec->ppsz_name ); + FREENULL( p_ec->ppsz_value ); } @@ -1163,7 +1208,8 @@ static int ASF_ReadObject_XXX(stream_t *s, asf_object_t *p_obj) { asf_object_XXX_t *p_XX = (asf_object_XXX_t *)p_obj; - uint8_t *p_peek, *p_data; + const uint8_t *p_peek; + uint8_t *p_data; int i_peek; if( ( i_peek = stream_Peek( s, &p_peek, p_XX->i_object_size ) ) < XXX ) @@ -1290,7 +1336,7 @@ static int ASF_ReadObject( stream_t *s, asf_object_t *p_obj, } /* link this object with father */ - if( p_father ) + if( p_father && ! i_result ) { if( p_father->common.p_first ) { @@ -1361,7 +1407,7 @@ static void ASF_FreeObject( stream_t *s, asf_object_t *p_obj ) static const struct { const guid_t *p_id; - char *psz_name; + const char *psz_name; } ASF_ObjectDumpDebugInfo[] = { { &asf_object_header_guid, "Header" }, @@ -1395,7 +1441,7 @@ static void ASF_ObjectDumpDebug( vlc_object_t *p_obj, char str[1024]; int i; union asf_object_u *p_child; - char *psz_name; + const char *psz_name; /* Find the name */ for( i = 0; ASF_ObjectDumpDebugInfo[i].p_id != NULL; i++ )