diff options
author | Timothy B. Terriberry <tterribe@xiph.org> | 2013-05-08 21:25:52 +0400 |
---|---|---|
committer | Timothy B. Terriberry <tterribe@xiph.org> | 2013-05-08 21:37:10 +0400 |
commit | dc58579c2c7e060084554018e9a2e8c25097a255 (patch) | |
tree | d9ce39180d3eb8dfeb76df4378c56fd44d32f6f8 /silk/resampler_private_down_FIR.c | |
parent | c41a81680c745f3a472af1771fbdb5830694e6a4 (diff) |
Fix several memory errors in the SILK resampler.
1) The memcpy's were using sizeof(opus_int32), but the type of the
local buffer was opus_int16.
2) Because the size was wrong, this potentially allowed the source
and destination regions of the memcpy overlap.
I _believe_ that nSamplesIn is at least fs_in_khZ, which is at
least 8.
Since RESAMPLER_ORDER_FIR_12 is only 8, I don't think that's a
problem once you fix the type size.
3) The size of the buffer used RESAMPLER_MAX_BATCH_SIZE_IN, but the
data stored in it was actually _twice_ the input batch size
(nSamplesIn<<1).
Because this never blew up in testing, I suspect that in practice
the batch sizes are reasonable enough that none of these things
was ever a problem, but proving that seems non-obvious.
This patch just converts the whole thing to use CELT's vararrays.
This fixes the buffer size problems (since we allocate a buffer
with the actual size we use) and gets these large buffers off the
stack on devices using the pseudo-stack.
It also fixes the memcpy problems by changing the sizeof to
opus_int16.
It turns out sFIR, which saved state between calls, was being used
elsewhere as opus_int32, so this converts it to a union to make
this sharing explicit.
Diffstat (limited to 'silk/resampler_private_down_FIR.c')
-rw-r--r-- | silk/resampler_private_down_FIR.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/silk/resampler_private_down_FIR.c b/silk/resampler_private_down_FIR.c index 5d24564c..8bedb0de 100644 --- a/silk/resampler_private_down_FIR.c +++ b/silk/resampler_private_down_FIR.c @@ -155,7 +155,7 @@ void silk_resampler_private_down_FIR( const opus_int16 *FIR_Coefs; /* Copy buffered samples to start of buffer */ - silk_memcpy( buf, S->sFIR, S->FIR_Order * sizeof( opus_int32 ) ); + silk_memcpy( buf, S->sFIR.i32, S->FIR_Order * sizeof( opus_int32 ) ); FIR_Coefs = &S->Coefs[ 2 ]; @@ -185,5 +185,5 @@ void silk_resampler_private_down_FIR( } /* Copy last part of filtered signal to the state for the next call */ - silk_memcpy( S->sFIR, &buf[ nSamplesIn ], S->FIR_Order * sizeof( opus_int32 ) ); + silk_memcpy( S->sFIR.i32, &buf[ nSamplesIn ], S->FIR_Order * sizeof( opus_int32 ) ); } |