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
This commit is contained in:
avolkov
2009-12-20 04:20:43 +00:00
parent ee470ba555
commit c71eb8eded
2 changed files with 11 additions and 6 deletions
+3 -3
View File
@@ -78,7 +78,7 @@ typedef struct
uint16 channels; /* number of channels */ uint16 channels; /* number of channels */
uint32 sampleFrames; /* number of sample frames */ uint32 sampleFrames; /* number of sample frames */
uint16 sampleSize; /* number of bits per sample */ 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 */ /* this is actually stored as IEEE-754 80bit in files */
} aiff_CommonChunk; } aiff_CommonChunk;
@@ -89,7 +89,7 @@ typedef struct
uint16 channels; /* number of channels */ uint16 channels; /* number of channels */
uint32 sampleFrames; /* number of sample frames */ uint32 sampleFrames; /* number of sample frames */
uint16 sampleSize; /* number of bits per sample */ 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 */ aiff_ID extTypeID; /* compression type ID */
char extName[32]; /* compression type name */ char extName[32]; /* compression type name */
} aiff_ExtCommonChunk; } aiff_ExtCommonChunk;
@@ -595,7 +595,7 @@ aifa_DecodeSDX2 (TFB_AiffSoundDecoder* aifa, void* buf, sint32 bufsize)
if (dec_pcm > aifa->max_pcm - aifa->cur_pcm) if (dec_pcm > aifa->max_pcm - aifa->cur_pcm)
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); dec_pcm = uio_fread (src, aifa->file_block, dec_pcm, aifa->fp);
aifa->cur_pcm += dec_pcm; aifa->cur_pcm += dec_pcm;
+8 -3
View File
@@ -38,7 +38,7 @@
typedef struct typedef struct
{ {
uint32 id; uint32 id;
sint32 size; uint32 size;
uint32 type; uint32 type;
} wave_FileHeader; } wave_FileHeader;
@@ -225,6 +225,7 @@ wava_Open (THIS_PTR, uio_DirHandle *dir, const char *filename)
TFB_WaveSoundDecoder* wava = (TFB_WaveSoundDecoder*) This; TFB_WaveSoundDecoder* wava = (TFB_WaveSoundDecoder*) This;
wave_FileHeader fileHdr; wave_FileHeader fileHdr;
wave_ChunkHeader chunkHdr; wave_ChunkHeader chunkHdr;
long dataLeft;
wava->fp = uio_fopen (dir, filename, "rb"); wava->fp = uio_fopen (dir, filename, "rb");
if (!wava->fp) if (!wava->fp)
@@ -252,8 +253,8 @@ wava_Open (THIS_PTR, uio_DirHandle *dir, const char *filename)
return false; return false;
} }
for (fileHdr.size = ((fileHdr.size + 1) & ~1) - 4; fileHdr.size != 0; for (dataLeft = ((fileHdr.size + 1) & ~1) - 4; dataLeft > 0;
fileHdr.size -= (((chunkHdr.size + 1) & ~1) + 8)) dataLeft -= (((chunkHdr.size + 1) & ~1) + 8))
{ {
if (!wava_readChunkHeader (wava, &chunkHdr)) if (!wava_readChunkHeader (wava, &chunkHdr))
{ {
@@ -309,6 +310,10 @@ wava_Open (THIS_PTR, uio_DirHandle *dir, const char *filename)
return false; 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 ? This->format = (wava->fmtHdr.channels == 1 ?
(wava->fmtHdr.bitsPerSample == 8 ? (wava->fmtHdr.bitsPerSample == 8 ?
wava_formats->mono8 : wava_formats->mono16) wava_formats->mono8 : wava_formats->mono16)