# HG changeset patch # User Ryan C. Gordon # Date 1024010137 0 # Node ID 4bcbc442d145aabd751d677c64a9588308b8ffc0 # Parent 0b0457462ccc8ad69884462ddfb8ccbfab82ac01 Fix to handle strange WAV fmt chunks. diff -r 0b0457462ccc -r 4bcbc442d145 decoders/wav.c --- a/decoders/wav.c Thu Jun 13 23:15:15 2002 +0000 +++ b/decoders/wav.c Thu Jun 13 23:15:37 2002 +0000 @@ -142,6 +142,8 @@ Uint16 wBlockAlign; Uint16 wBitsPerSample; + Uint32 next_chunk_offset; + Uint32 sample_frame_size; Uint32 data_starting_offset; Uint32 total_bytes; @@ -182,6 +184,9 @@ fmt->chunkID = fmtID; BAIL_IF_MACRO(!read_le32(rw, &fmt->chunkSize), NULL, 0); + BAIL_IF_MACRO(fmt->chunkSize < 16, "WAV: Invalid chunk size", 0); + fmt->next_chunk_offset = SDL_RWtell(rw) + fmt->chunkSize; + BAIL_IF_MACRO(!read_le16(rw, &fmt->wFormatTag), NULL, 0); BAIL_IF_MACRO(!read_le16(rw, &fmt->wChannels), NULL, 0); BAIL_IF_MACRO(!read_le32(rw, &fmt->dwSamplesPerSec), NULL, 0); @@ -708,6 +713,7 @@ } /* else */ BAIL_IF_MACRO(!read_fmt(rw, fmt), NULL, 0); + SDL_RWseek(rw, fmt->next_chunk_offset, SEEK_SET); BAIL_IF_MACRO(!find_chunk(rw, dataID), "WAV: No data chunk.", 0); BAIL_IF_MACRO(!read_data_chunk(rw, &d), "WAV: Can't read data chunk.", 0);