Fix several memory errors in the SILK resampler.
authorTimothy B. Terriberry <tterribe@xiph.org>
Wed, 8 May 2013 17:25:52 +0000 (10:25 -0700)
committerTimothy B. Terriberry <tterribe@xiph.org>
Wed, 8 May 2013 17:37:10 +0000 (10:37 -0700)
commitdc58579c2c7e060084554018e9a2e8c25097a255
treed9ce39180d3eb8dfeb76df4378c56fd44d32f6f8
parentc41a81680c745f3a472af1771fbdb5830694e6a4
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.
silk/resampler_private_IIR_FIR.c
silk/resampler_private_down_FIR.c
silk/resampler_structs.h