summaryrefslogtreecommitdiff
path: root/data/lighttpd/lighttpd-1.4.53/src/safe_memclear.c
diff options
context:
space:
mode:
Diffstat (limited to 'data/lighttpd/lighttpd-1.4.53/src/safe_memclear.c')
-rw-r--r--data/lighttpd/lighttpd-1.4.53/src/safe_memclear.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/data/lighttpd/lighttpd-1.4.53/src/safe_memclear.c b/data/lighttpd/lighttpd-1.4.53/src/safe_memclear.c
new file mode 100644
index 000000000..0e1c9dfde
--- /dev/null
+++ b/data/lighttpd/lighttpd-1.4.53/src/safe_memclear.c
@@ -0,0 +1,47 @@
+#include "first.h"
+
+#include "safe_memclear.h"
+
+#include <string.h>
+
+#if !defined(HAVE_MEMSET_S) && !defined(HAVE_EXPLICIT_BZERO)
+
+# if defined(HAVE_WEAK_SYMBOLS)
+/* it seems weak functions are never inlined, even for static builds */
+__attribute__((weak)) void __li_safe_memset_hook(void *buf, size_t len);
+
+void __li_safe_memset_hook(void *buf, size_t len)
+{
+ UNUSED(buf);
+ UNUSED(len);
+}
+# endif /* HAVE_WEAK_SYMBOLS */
+
+static void* safe_memset(void *s, int c, size_t n)
+{
+ if (n > 0) {
+ volatile unsigned volatile_zero = 0;
+ volatile unsigned char *vs = (volatile unsigned char*)s;
+
+ do {
+ memset(s, c, n);
+ } while (vs[volatile_zero] != (unsigned char)c);
+# if defined(HAVE_WEAK_SYMBOLS)
+ __li_safe_memset_hook(s, n);
+# endif /* HAVE_WEAK_SYMBOLS */
+ }
+
+ return s;
+}
+#endif /* !defined(HAVE_MEMSET_S) && !defined(HAVE_EXPLICIT_BZERO) */
+
+
+void safe_memclear(void *s, size_t n) {
+#if defined(HAVE_MEMSET_S)
+ memset_s(s, n, 0, n);
+#elif defined(HAVE_EXPLICIT_BZERO)
+ explicit_bzero(s, n);
+#else
+ safe_memset(s, 0, n);
+#endif
+}