diff options
author | Neelkamal Semwal <neelkamal.semwal@ittiam.com> | 2021-09-30 18:57:51 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-09-30 18:57:51 +0000 |
commit | 545a90bc56d3367536bbe35a998510d0e399de08 (patch) | |
tree | 600db2cceed1c6fffd057f37bba63a75f313e843 /celt | |
parent | 3c795870e3f5c5852cf08ad0ae69e8007df72f4b (diff) | |
parent | 650210f37c13bf41c66896a4071a9556261bf6ed (diff) | |
download | libopus-545a90bc56d3367536bbe35a998510d0e399de08.tar.gz |
libOpus: fix OOB read in ssse4 correlation kernel am: a6a69736ba am: 650210f37c
Original change: https://googleplex-android-review.googlesource.com/c/platform/external/libopus/+/15935007
Change-Id: I54ad18a9780e973dae808debf3ec08786bdf60ef
Diffstat (limited to 'celt')
-rw-r--r-- | celt/stack_alloc.h | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/celt/stack_alloc.h b/celt/stack_alloc.h index ae40e2a1..b289facd 100644 --- a/celt/stack_alloc.h +++ b/celt/stack_alloc.h @@ -88,10 +88,22 @@ * @param type Type of element */ +#ifndef SIMD_EXTRA_ALLOC_BYTES +#error define SIMD_EXTRA_ALLOC_BYTES appropriately in your makefile +/* + * Useful values: + * 0 for an all-scalar processor, which should never over-read the arrays + * 16 for an implementation using ARM Neon or X86 SSE4 instructions, which work + * with blocks of 16 bytes (128 bits) + */ +#endif + #if defined(VAR_ARRAYS) #define VARDECL(type, var) -#define ALLOC(var, size, type) type var[size] +// include a full SIMD width afterwards; +#define ALLOC(var, size, type) type var[(size) + ((SIMD_EXTRA_ALLOC_BYTES)/sizeof(type))] + #define SAVE_STACK #define RESTORE_STACK #define ALLOC_STACK @@ -103,9 +115,11 @@ #define VARDECL(type, var) type *var # ifdef _WIN32 -# define ALLOC(var, size, type) var = ((type*)_alloca(sizeof(type)*(size))) +# define ALLOC(var, size, type) var = \ + ((type*)_alloca(sizeof(type)*(size) + SIMD_EXTRA_ALLOC_BYTES)) # else -# define ALLOC(var, size, type) var = ((type*)alloca(sizeof(type)*(size))) +# define ALLOC(var, size, type) var = \ + ((type*)alloca(sizeof(type)*(size) + SIMD_EXTRA_ALLOC_BYTES)) # endif #define SAVE_STACK @@ -151,6 +165,11 @@ extern char *global_stack_top; #endif /* ENABLE_VALGRIND */ +// this path has NOT been modified to be safe in the face of SIMD over-reads +#if SIMD_EXTRA_ALLOC_BYTES != 0 +#error "ALLOC() is not updated in this configuration to provide for SIMD over-reads" +#endif + #include "os_support.h" #define VARDECL(type, var) type *var #define ALLOC(var, size, type) var = PUSH(global_stack, size, type) |