diff options
author | Alistair Delva <adelva@google.com> | 2020-08-20 16:14:23 -0700 |
---|---|---|
committer | Alistair Delva <adelva@google.com> | 2020-08-20 16:53:18 -0700 |
commit | d9da10d147d633fdb6ec65e17ff4b8447419d83e (patch) | |
tree | 8f93e8fdc2907f141e0924910bfec26669819f0b /openbsd-compat/explicit_bzero.c | |
parent | 22246b08952d746a7cc5a292570636cf4277598f (diff) | |
parent | ecb2c02d994b3e21994f31a70ff911667c262f1f (diff) |
Merge upstream-master into master
Commit ecb2c02d994b3e21994f31a70ff911667c262f1f upstream
This nearly (but not quite) corresponds to V_8_3_P1; subsequent
cherry-picks will correct this.
Bug: 162492243
Change-Id: I3c079d86435b7c25aefff4538dc89a3002b1e25b
Diffstat (limited to 'openbsd-compat/explicit_bzero.c')
-rw-r--r-- | openbsd-compat/explicit_bzero.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/openbsd-compat/explicit_bzero.c b/openbsd-compat/explicit_bzero.c index 13f87fe3..7a2fa354 100644 --- a/openbsd-compat/explicit_bzero.c +++ b/openbsd-compat/explicit_bzero.c @@ -6,6 +6,7 @@ */ #include "includes.h" + #include <string.h> /* @@ -19,6 +20,8 @@ void explicit_bzero(void *p, size_t n) { + if (n == 0) + return; (void)memset_s(p, n, 0, n); } @@ -28,12 +31,29 @@ explicit_bzero(void *p, size_t n) * Indirect bzero through a volatile pointer to hopefully avoid * dead-store optimisation eliminating the call. */ -static void* (* volatile ssh_memset)(void *, int, size_t) = memset; +#if defined(ANDROID) +static void (* volatile ssh_bzero)(void *, size_t) = __bionic_bzero; +#else +static void (* volatile ssh_bzero)(void *, size_t) = bzero; +#endif void explicit_bzero(void *p, size_t n) { - ssh_memset(p, 0, n); + if (n == 0) + return; + /* + * clang -fsanitize=memory needs to intercept memset-like functions + * to correctly detect memory initialisation. Make sure one is called + * directly since our indirection trick above successfully confuses it. + */ +#if defined(__has_feature) +# if __has_feature(memory_sanitizer) + memset(p, 0, n); +# endif +#endif + + ssh_bzero(p, n); } #endif /* HAVE_MEMSET_S */ |