AC_CHECK_FUNCS(strlcpy strlcat memmem getpeereid sigaction sigqueue)
AC_CHECK_FUNCS(inet_ntop inet_pton poll getline memrchr regcomp)
AC_CHECK_FUNCS(err errx warn warnx getprogname setprogname)
-AC_CHECK_FUNCS(posix_memalign memalign valloc)
+AC_CHECK_FUNCS(posix_memalign memalign valloc explicit_bzero)
AC_CHECK_FUNCS(getopt getopt_long getopt_long_only)
AC_CHECK_FUNCS(fls flsl flsll ffs ffsl ffsll)
AC_CHECK_FUNCS(fnmatch mbsnrtowcs nl_langinfo strtod_l)
}
#endif
+#ifndef HAVE_EXPLICIT_BZERO
+
+/* avoid link-time optimization */
+#if defined(__GNUC__x) || __has_attribute(weak)
+void __explicit_bzero_hack(void *, size_t);
+__attribute__((weak)) void __explicit_bzero_hack(void *buf, size_t len) { }
+#else
+typedef void (*__explicit_bzero_cb_t)(void *, size_t);
+static void __explicit_bzero_hack_cb(void *buf, size_t len) { }
+static volatile __explicit_bzero_cb_t __explicit_bzero_hack = __explicit_bzero_hack_cb;
+#endif
+
+void explicit_bzero(void *buf, size_t len)
+{
+ memset(buf, 0, len);
+ __explicit_bzero_hack(buf, len);
+}
+
+#endif
+
#ifndef HAVE_BASENAME
const char *basename(const char *path)
{
const char *dirname(const char *path);
#endif
+#ifndef HAVE_EXPLICIT_BZERO
+#undef explicit_bzero
+#define explicit_bzero(a,b) usual_explicit_bzero(a,b)
+/** Definitely clear memory */
+void explicit_bzero(void *buf, size_t len);
+#endif
+
/*
* strerror, strerror_r
*/