diff options
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.c | 47 |
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 +} |