Changeset e81f6fca6f99e83338959f956b1f4d1e14602078

Show
Ignore:
Timestamp:
06/29/08 00:12:00 (2 months ago)
Author:
Laurent Aimar <fenrir@videolan.org>
git-committer:
Laurent Aimar <fenrir@videolan.org> 1214691120 +0000
git-parent:

[a11cc33695f3b4bc9f939e457bd3e5f16397968f]

git-author:
Laurent Aimar <fenrir@videolan.org> 1214691120 +0000
Message:

Fixed segfault when parsing wav file to check for dts/a52.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • modules/demux/a52.c

    r3561b9b re81f6fc  
    7575#define PCM_FRAME_SIZE (1536 * 4) 
    7676#define A52_PACKET_SIZE (4 * PCM_FRAME_SIZE) 
     77#define A52_PROBE_SIZE (512*1024) 
    7778#define A52_MAX_HEADER_SIZE 10 
    78  
    7979 
    8080/***************************************************************************** 
     
    9090 
    9191    /* Check if we are dealing with a WAV file */ 
    92     if( stream_Peek( p_demux->s, &p_peek, 12 ) == 12 && 
    93         !memcmp( p_peek, "RIFF", 4 ) && !memcmp( p_peek + 8, "WAVE", 4 ) ) 
    94     { 
    95         int i_size; 
    96  
     92    if( stream_Peek( p_demux->s, &p_peek, 12+8 ) == 12+8 && 
     93        !memcmp( p_peek, "RIFF", 4 ) && !memcmp( &p_peek[8], "WAVE", 4 ) ) 
     94    { 
    9795        /* Skip the wave header */ 
    9896        i_peek = 12 + 8; 
    99         while( stream_Peek( p_demux->s, &p_peek, i_peek ) == i_peek && 
    100                memcmp( p_peek + i_peek - 8, "data", 4 ) ) 
    101         { 
    102             i_peek += GetDWLE( p_peek + i_peek - 4 ) + 8; 
     97        while( memcmp( p_peek + i_peek - 8, "data", 4 ) ) 
     98        { 
     99            uint32_t i_len = GetDWLE( p_peek + i_peek - 4 ); 
     100            if( i_len > A52_PROBE_SIZE || i_peek + i_len > A52_PROBE_SIZE ) 
     101                return VLC_EGENERIC; 
     102 
     103            i_peek += i_len + 8; 
     104            if( stream_Peek( p_demux->s, &p_peek, i_peek ) != i_peek ) 
     105                return VLC_EGENERIC; 
    103106        } 
    104107 
     
    107110        /* Some A52 wav files don't begin with a sync code so we do a more 
    108111         * extensive search */ 
    109         i_size = stream_Peek( p_demux->s, &p_peek, i_peek + A52_PACKET_SIZE * 2); 
     112        int i_size = stream_Peek( p_demux->s, &p_peek, i_peek + A52_PACKET_SIZE * 2); 
    110113        i_size -= (PCM_FRAME_SIZE + A52_MAX_HEADER_SIZE); 
    111114 
  • modules/demux/dts.c

    r3561b9b re81f6fc  
    8686        !memcmp( p_peek, "RIFF", 4 ) && !memcmp( &p_peek[8], "WAVE", 4 ) ) 
    8787    { 
    88         int i_size; 
    89  
    9088        /* Find the wave format header */ 
    91         i_peek = 20
     89        i_peek = 12 + 8
    9290        while( memcmp( p_peek + i_peek - 8, "fmt ", 4 ) ) 
    9391        { 
    94             i_size = GetDWLE( p_peek + i_peek - 4 ); 
    95             if( i_size + i_peek > DTS_PROBE_SIZE ) return VLC_EGENERIC; 
    96             i_peek += i_size + 8; 
    97  
     92            uint32_t i_len = GetDWLE( p_peek + i_peek - 4 ); 
     93            if( i_len > DTS_PROBE_SIZE || i_peek + i_len > DTS_PROBE_SIZE ) 
     94                return VLC_EGENERIC; 
     95 
     96            i_peek += i_len + 8; 
    9897            if( stream_Peek( p_demux->s, &p_peek, i_peek ) != i_peek ) 
    9998                return VLC_EGENERIC; 
     
    101100 
    102101        /* Sanity check the wave format header */ 
    103         i_size = GetDWLE( p_peek + i_peek - 4 ); 
    104         if( i_size + i_peek > DTS_PROBE_SIZE ) return VLC_EGENERIC; 
    105         i_peek += i_size + 8; 
     102        uint32_t i_len = GetDWLE( p_peek + i_peek - 4 ); 
     103        if( i_len > DTS_PROBE_SIZE ) 
     104            return VLC_EGENERIC; 
     105 
     106        i_peek += i_len + 8; 
    106107        if( stream_Peek( p_demux->s, &p_peek, i_peek ) != i_peek ) 
    107108            return VLC_EGENERIC; 
    108         if( GetWLE( p_peek + i_peek - i_size - 8 /* wFormatTag */ ) != 
     109        if( GetWLE( p_peek + i_peek - i_len - 8 /* wFormatTag */ ) != 
    109110            1 /* WAVE_FORMAT_PCM */ ) 
    110111            return VLC_EGENERIC; 
    111         if( GetWLE( p_peek + i_peek - i_size - 6 /* nChannels */ ) != 2 ) 
    112             return VLC_EGENERIC; 
    113         if( GetDWLE( p_peek + i_peek - i_size - 4 /* nSamplesPerSec */ ) != 
     112        if( GetWLE( p_peek + i_peek - i_len - 6 /* nChannels */ ) != 2 ) 
     113            return VLC_EGENERIC; 
     114        if( GetDWLE( p_peek + i_peek - i_len - 4 /* nSamplesPerSec */ ) != 
    114115            44100 ) 
    115116            return VLC_EGENERIC; 
     
    118119        while( memcmp( p_peek + i_peek - 8, "data", 4 ) ) 
    119120        { 
    120             i_size = GetDWLE( p_peek + i_peek - 4 ); 
    121             if( i_size + i_peek > DTS_PROBE_SIZE ) return VLC_EGENERIC; 
    122             i_peek += i_size + 8; 
    123  
     121            uint32_t i_len = GetDWLE( p_peek + i_peek - 4 ); 
     122            if( i_len > DTS_PROBE_SIZE || i_peek + i_len > DTS_PROBE_SIZE ) 
     123                return VLC_EGENERIC; 
     124 
     125            i_peek += i_len + 8; 
    124126            if( stream_Peek( p_demux->s, &p_peek, i_peek ) != i_peek ) 
    125127                return VLC_EGENERIC; 
     
    128130        /* Some DTS wav files don't begin with a sync code so we do a more 
    129131         * extensive search */ 
    130         i_size = stream_Peek( p_demux->s, &p_peek, DTS_PROBE_SIZE ); 
     132        int i_size = stream_Peek( p_demux->s, &p_peek, DTS_PROBE_SIZE ); 
    131133        i_size -= DTS_MAX_HEADER_SIZE; 
    132134