Skip to content
Snippets Groups Projects
Forked from Xiph.Org / Opus
3836 commits behind the upstream repository.
  • Timothy B. Terriberry's avatar
    dc58579c
    Fix several memory errors in the SILK resampler. · dc58579c
    Timothy B. Terriberry authored
    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.
    dc58579c
    History
    Fix several memory errors in the SILK resampler.
    Timothy B. Terriberry authored
    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.