summaryrefslogtreecommitdiff
path: root/openbsd-compat/explicit_bzero.c
diff options
context:
space:
mode:
Diffstat (limited to 'openbsd-compat/explicit_bzero.c')
-rw-r--r--openbsd-compat/explicit_bzero.c24
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 */