Changeset e81f6fca6f99e83338959f956b1f4d1e14602078
- 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
| r3561b9b |
re81f6fc |
|
| 75 | 75 | #define PCM_FRAME_SIZE (1536 * 4) |
|---|
| 76 | 76 | #define A52_PACKET_SIZE (4 * PCM_FRAME_SIZE) |
|---|
| | 77 | #define A52_PROBE_SIZE (512*1024) |
|---|
| 77 | 78 | #define A52_MAX_HEADER_SIZE 10 |
|---|
| 78 | | |
|---|
| 79 | 79 | |
|---|
| 80 | 80 | /***************************************************************************** |
|---|
| … | … | |
| 90 | 90 | |
|---|
| 91 | 91 | /* 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 | { |
|---|
| 97 | 95 | /* Skip the wave header */ |
|---|
| 98 | 96 | 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; |
|---|
| 103 | 106 | } |
|---|
| 104 | 107 | |
|---|
| … | … | |
| 107 | 110 | /* Some A52 wav files don't begin with a sync code so we do a more |
|---|
| 108 | 111 | * 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); |
|---|
| 110 | 113 | i_size -= (PCM_FRAME_SIZE + A52_MAX_HEADER_SIZE); |
|---|
| 111 | 114 | |
|---|
| r3561b9b |
re81f6fc |
|
| 86 | 86 | !memcmp( p_peek, "RIFF", 4 ) && !memcmp( &p_peek[8], "WAVE", 4 ) ) |
|---|
| 87 | 87 | { |
|---|
| 88 | | int i_size; |
|---|
| 89 | | |
|---|
| 90 | 88 | /* Find the wave format header */ |
|---|
| 91 | | i_peek = 20; |
|---|
| | 89 | i_peek = 12 + 8; |
|---|
| 92 | 90 | while( memcmp( p_peek + i_peek - 8, "fmt ", 4 ) ) |
|---|
| 93 | 91 | { |
|---|
| 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; |
|---|
| 98 | 97 | if( stream_Peek( p_demux->s, &p_peek, i_peek ) != i_peek ) |
|---|
| 99 | 98 | return VLC_EGENERIC; |
|---|
| … | … | |
| 101 | 100 | |
|---|
| 102 | 101 | /* 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; |
|---|
| 106 | 107 | if( stream_Peek( p_demux->s, &p_peek, i_peek ) != i_peek ) |
|---|
| 107 | 108 | 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 */ ) != |
|---|
| 109 | 110 | 1 /* WAVE_FORMAT_PCM */ ) |
|---|
| 110 | 111 | 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 */ ) != |
|---|
| 114 | 115 | 44100 ) |
|---|
| 115 | 116 | return VLC_EGENERIC; |
|---|
| … | … | |
| 118 | 119 | while( memcmp( p_peek + i_peek - 8, "data", 4 ) ) |
|---|
| 119 | 120 | { |
|---|
| 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; |
|---|
| 124 | 126 | if( stream_Peek( p_demux->s, &p_peek, i_peek ) != i_peek ) |
|---|
| 125 | 127 | return VLC_EGENERIC; |
|---|
| … | … | |
| 128 | 130 | /* Some DTS wav files don't begin with a sync code so we do a more |
|---|
| 129 | 131 | * 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 ); |
|---|
| 131 | 133 | i_size -= DTS_MAX_HEADER_SIZE; |
|---|
| 132 | 134 | |
|---|