diff options
author | Erik de Castro Lopo <erikd@mega-nerd.com> | 2015-02-13 20:25:59 +1100 |
---|---|---|
committer | Erik de Castro Lopo <erikd@mega-nerd.com> | 2015-02-14 12:41:19 +1100 |
commit | 3f532789b0eec5acdaff98d03f4f5b1260775f22 (patch) | |
tree | ca61a90c6a0d35469fd8ad1d9db77278b2416f3f | |
parent | 0542f33fe23b1e012c1202746906be098278d0d8 (diff) |
src/(rf64|w64|wav).c : Validate parsed channel count.
-rw-r--r-- | src/rf64.c | 6 | ||||
-rw-r--r-- | src/w64.c | 6 | ||||
-rw-r--r-- | src/wav.c | 6 |
3 files changed, 18 insertions, 0 deletions
@@ -328,6 +328,12 @@ rf64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock) if (psf->dataoffset <= 0) return SFE_WAV_NO_DATA ; + if (psf->sf.channels < 1) + return SFE_CHANNEL_COUNT_ZERO ; + + if (psf->sf.channels >= SF_MAX_CHANNELS) + return SFE_CHANNEL_COUNT ; + /* WAVs can be little or big endian */ psf->endian = psf->rwf_endian ; @@ -375,6 +375,12 @@ w64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock) if (psf->dataoffset <= 0) return SFE_W64_NO_DATA ; + if (psf->sf.channels < 1) + return SFE_CHANNEL_COUNT_ZERO ; + + if (psf->sf.channels >= SF_MAX_CHANNELS) + return SFE_CHANNEL_COUNT ; + psf->endian = SF_ENDIAN_LITTLE ; /* All W64 files are little endian. */ if (psf_ftell (psf) != psf->dataoffset) @@ -685,6 +685,12 @@ wav_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock) if (psf->dataoffset <= 0) return SFE_WAV_NO_DATA ; + if (psf->sf.channels < 1) + return SFE_CHANNEL_COUNT_ZERO ; + + if (psf->sf.channels >= SF_MAX_CHANNELS) + return SFE_CHANNEL_COUNT ; + if (format != WAVE_FORMAT_PCM && (parsestage & HAVE_fact) == 0) psf_log_printf (psf, "**** All non-PCM format files should have a 'fact' chunk.\n") ; |