From c71eb8edede08c1efd6c8d5850377bb5c36c2d29 Mon Sep 17 00:00:00 2001 From: avolkov Date: Sun, 20 Dec 2009 04:20:43 +0000 Subject: [PATCH] Fix signed/unsigned data reads in sound decoders git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3457 8092fc87-c524-0410-9efc-e669fe64eaf9 --- sc2/src/libs/sound/decoders/aiffaud.c | 6 +++--- sc2/src/libs/sound/decoders/wav.c | 11 ++++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/sc2/src/libs/sound/decoders/aiffaud.c b/sc2/src/libs/sound/decoders/aiffaud.c index 24d950d78..cd6b7364f 100644 --- a/sc2/src/libs/sound/decoders/aiffaud.c +++ b/sc2/src/libs/sound/decoders/aiffaud.c @@ -78,7 +78,7 @@ typedef struct uint16 channels; /* number of channels */ uint32 sampleFrames; /* number of sample frames */ uint16 sampleSize; /* number of bits per sample */ - uint32 sampleRate; /* number of frames per second */ + sint32 sampleRate; /* number of frames per second */ /* this is actually stored as IEEE-754 80bit in files */ } aiff_CommonChunk; @@ -89,7 +89,7 @@ typedef struct uint16 channels; /* number of channels */ uint32 sampleFrames; /* number of sample frames */ uint16 sampleSize; /* number of bits per sample */ - uint32 sampleRate; /* number of frames per second */ + sint32 sampleRate; /* number of frames per second */ aiff_ID extTypeID; /* compression type ID */ char extName[32]; /* compression type name */ } aiff_ExtCommonChunk; @@ -595,7 +595,7 @@ aifa_DecodeSDX2 (TFB_AiffSoundDecoder* aifa, void* buf, sint32 bufsize) if (dec_pcm > aifa->max_pcm - aifa->cur_pcm) dec_pcm = aifa->max_pcm - aifa->cur_pcm; - src = (uint8*)buf + bufsize - (dec_pcm * aifa->file_block); + src = (sint8*)buf + bufsize - (dec_pcm * aifa->file_block); dec_pcm = uio_fread (src, aifa->file_block, dec_pcm, aifa->fp); aifa->cur_pcm += dec_pcm; diff --git a/sc2/src/libs/sound/decoders/wav.c b/sc2/src/libs/sound/decoders/wav.c index 573be59eb..c22f63f77 100644 --- a/sc2/src/libs/sound/decoders/wav.c +++ b/sc2/src/libs/sound/decoders/wav.c @@ -38,7 +38,7 @@ typedef struct { uint32 id; - sint32 size; + uint32 size; uint32 type; } wave_FileHeader; @@ -225,6 +225,7 @@ wava_Open (THIS_PTR, uio_DirHandle *dir, const char *filename) TFB_WaveSoundDecoder* wava = (TFB_WaveSoundDecoder*) This; wave_FileHeader fileHdr; wave_ChunkHeader chunkHdr; + long dataLeft; wava->fp = uio_fopen (dir, filename, "rb"); if (!wava->fp) @@ -252,8 +253,8 @@ wava_Open (THIS_PTR, uio_DirHandle *dir, const char *filename) return false; } - for (fileHdr.size = ((fileHdr.size + 1) & ~1) - 4; fileHdr.size != 0; - fileHdr.size -= (((chunkHdr.size + 1) & ~1) + 8)) + for (dataLeft = ((fileHdr.size + 1) & ~1) - 4; dataLeft > 0; + dataLeft -= (((chunkHdr.size + 1) & ~1) + 8)) { if (!wava_readChunkHeader (wava, &chunkHdr)) { @@ -309,6 +310,10 @@ wava_Open (THIS_PTR, uio_DirHandle *dir, const char *filename) return false; } + if (dataLeft != 0) + log_add (log_Warning, "wava_Open(): bad or unsupported wave file, " + "size in header does not match read chunks"); + This->format = (wava->fmtHdr.channels == 1 ? (wava->fmtHdr.bitsPerSample == 8 ? wava_formats->mono8 : wava_formats->mono16)