diff options
author | Tristan Matthews <le.businessman@gmail.com> | 2014-08-12 09:12:24 +0400 |
---|---|---|
committer | Tristan Matthews <le.businessman@gmail.com> | 2014-08-12 10:19:43 +0400 |
commit | 566a73a6c1e28c13979f26732e55c4f3629689e8 (patch) | |
tree | 924e2451714176bc1683779da037a6c177c78cf1 | |
parent | 1f61ae81a2fa777fea564b205f53c6dca296dd0d (diff) |
speexenc: don't read past the end of WAV data
Fixes https://trac.xiph.org/ticket/2036
Reported by justcar
-rw-r--r-- | src/speexenc.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/speexenc.c b/src/speexenc.c index 4ad51ae..8196c3a 100644 --- a/src/speexenc.c +++ b/src/speexenc.c @@ -89,24 +89,40 @@ static int read_samples(FILE *fin,int frame_size, int bits, int channels, int ls int i; short *s; int nb_read; + size_t to_read; if (size && *size<=0) { return 0; } + + to_read = bits/8*channels*frame_size; + /*Read input audio*/ if (size) - *size -= bits/8*channels*frame_size; + { + if (*size >= to_read) + { + *size -= to_read; + } + else + { + to_read = *size; + *size = 0; + } + } + if (buff) { for (i=0;i<12;i++) in[i]=buff[i]; - nb_read = fread(in+12,1,bits/8*channels*frame_size-12, fin) + 12; + nb_read = fread(in+12,1,to_read-12,fin) + 12; if (size) *size += 12; } else { - nb_read = fread(in,1,bits/8*channels* frame_size, fin); + nb_read = fread(in,1,to_read,fin); } + nb_read /= bits/8*channels; /*fprintf (stderr, "%d\n", nb_read);*/ |