summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/snd_mem.c36
1 files changed, 20 insertions, 16 deletions
diff --git a/source/snd_mem.c b/source/snd_mem.c
index c51d8f9..0dd2bb1 100644
--- a/source/snd_mem.c
+++ b/source/snd_mem.c
@@ -254,34 +254,38 @@ static int GetLittleLong(void) {
return val;
}
-static void FindNextChunk( uint32 name ) {
+static void FindNextChunk( const char *name, uint32 search ) {
uint32 chunk, length;
+ int i;
- while( 1 ) {
+ for( i = 0; i < 1000; i++ ) {
if( data_p >= iff_end ) {
- // didn't find the chunk
data_p = NULL;
- return;
+ return; // didn't find the chunk
}
-
+
chunk = GetLittleLong();
iff_chunk_len = GetLittleLong();
- if( data_p + iff_chunk_len > iff_end ) {
- Com_DPrintf( "FindNextChunk: oversize chunk %#x\n", chunk );
+ if( iff_chunk_len > iff_end - data_p ) {
+ Com_DPrintf( "%s: oversize chunk %#x in %s\n",
+ __func__, chunk, name );
data_p = NULL;
return;
}
- if( chunk == name ) {
+ if( chunk == search ) {
return;
}
length = ( iff_chunk_len + 1 ) & ~1;
data_p += length;
- }
+ }
+
+ Com_WPrintf( "%s: too many iterations for chunk %#x in %s\n",
+ __func__, search, name );
}
-static void FindChunk( uint32 name ) {
+static void FindChunk( const char *name, uint32 search ) {
data_p = iff_data;
- FindNextChunk( name );
+ FindNextChunk( name, search );
}
#define TAG_RIFF MakeLong( 'R', 'I', 'F', 'F' )
@@ -305,7 +309,7 @@ static qboolean GetWavinfo( const char *name, wavinfo_t *info ) {
memset (info, 0, sizeof(*info));
// find "RIFF" chunk
- FindChunk( TAG_RIFF );
+ FindChunk( name, TAG_RIFF );
if( !data_p ) {
Com_DPrintf( "%s has missing/invalid RIFF chunk\n", name );
return qfalse;
@@ -319,7 +323,7 @@ static qboolean GetWavinfo( const char *name, wavinfo_t *info ) {
iff_data = data_p;
// get "fmt " chunk
- FindChunk( TAG_fmt );
+ FindChunk( name, TAG_fmt );
if( !data_p ) {
Com_DPrintf("%s has missing/invalid fmt chunk\n", name );
return qfalse;
@@ -358,12 +362,12 @@ static qboolean GetWavinfo( const char *name, wavinfo_t *info ) {
}
// get cue chunk
- FindChunk( TAG_cue );
+ FindChunk( name, TAG_cue );
if( data_p ) {
data_p += 24;
info->loopstart = GetLittleLong();
- FindNextChunk( TAG_LIST );
+ FindNextChunk( name, TAG_LIST );
if( data_p ) {
data_p += 20;
chunk = GetLittleLong();
@@ -379,7 +383,7 @@ static qboolean GetWavinfo( const char *name, wavinfo_t *info ) {
}
// find data chunk
- FindChunk( TAG_data );
+ FindChunk( name, TAG_data );
if( !data_p ) {
Com_DPrintf( "%s has missing/invalid data chunk\n", name );
return qfalse;