string: explicit_bzero
authorMarko Kreen <markokr@gmail.com>
Fri, 11 Jul 2014 21:30:59 +0000 (00:30 +0300)
committerMarko Kreen <markokr@gmail.com>
Mon, 14 Jul 2014 11:01:18 +0000 (14:01 +0300)
m4/usual.m4
usual/string.c
usual/string.h

index dd73f8a71c15785700cae0e0854c55c43b1c9403..864f90ecc1190b906b7370c6cb6f9e2335a4ab90 100644 (file)
@@ -205,7 +205,7 @@ dnl AC_CHECK_FUNCS(basename dirname) # unstable, provide always
 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)
index 0e663d16c2319fe56760a4f7dbdde0c17be1403f..472fdff1dfc48513adbd71fb61159d2cfe4f9b04 100644 (file)
@@ -251,6 +251,26 @@ void *memmem(const void *haystack, size_t hlen, const void *needle, size_t nlen)
 }
 #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)
 {
index 21a738b92498f52ac50eef9e8d2dd7d0262da6ad..ebef01356f89d2dfaa13daaa554b9cddeba9a5c2 100644 (file)
@@ -103,6 +103,13 @@ 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
  */