[PATCH] common/mischelp: use platform memory zeroing function for wipememory
Jussi Kivilinna
jussi.kivilinna at iki.fi
Tue Nov 13 21:31:28 CET 2018
* common/mischelp.h (wipememory): Replace macro with function
prototype.
(wipememory2): Remove.
* common/mischelp.c (wipememory): New.
* configure.ac (AC_CHECK_FUNCS): Check for 'explicit_bzero'.
--
In new wipememory function, memory is cleared through platform
provided secure memory zeroing function, SecureZeroMemory
or explicit_bzero.
If none of these is available, memset is called through
volatile function pointer to so that compiler won't optimize
away the call.
Signed-off-by: Jussi Kivilinna <jussi.kivilinna at iki.fi>
---
0 files changed
diff --git a/common/mischelp.c b/common/mischelp.c
index 75ba60714..81dd501f8 100644
--- a/common/mischelp.c
+++ b/common/mischelp.c
@@ -49,6 +49,22 @@
#include "mischelp.h"
+void
+wipememory (void *ptr, size_t len)
+{
+#if defined(HAVE_W32_SYSTEM) && defined(SecureZeroMemory)
+ SecureZeroMemory (ptr, len);
+#elif defined(HAVE_EXPLICIT_BZERO)
+ explicit_bzero (ptr, len);
+#else
+ /* Prevent compiler from optimizing away the call to memset by accessing
+ memset through volatile pointer. */
+ static void *(*volatile memset_ptr)(void *, int, size_t) = (void *)memset;
+ memset_ptr (ptr, 0, len);
+#endif
+}
+
+
/* Check whether the files NAME1 and NAME2 are identical. This is for
example achieved by comparing the inode numbers of the files. */
int
diff --git a/common/mischelp.h b/common/mischelp.h
index 18ec96edf..bdee5a443 100644
--- a/common/mischelp.h
+++ b/common/mischelp.h
@@ -47,15 +47,9 @@ time_t timegm (struct tm *tm);
#define DIM(v) (sizeof(v)/sizeof((v)[0]))
#define DIMof(type,member) DIM(((type *)0)->member)
-/* To avoid that a compiler optimizes certain memset calls away, these
- macros may be used instead. */
-#define wipememory2(_ptr,_set,_len) do { \
- volatile char *_vptr=(volatile char *)(_ptr); \
- size_t _vlen=(_len); \
- while(_vlen) { *_vptr=(_set); _vptr++; _vlen--; } \
- } while(0)
-#define wipememory(_ptr,_len) wipememory2(_ptr,0,_len)
-
+/* To avoid that a compiler optimizes certain memset calls away,
+ wipememory function may be used instead. */
+void wipememory(void *ptr, size_t len);
/* Include hacks which are mainly required for Slowaris. */
#ifdef GNUPG_COMMON_NEED_AFLOCAL
diff --git a/configure.ac b/configure.ac
index 795daa400..f961adbde 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1400,16 +1400,16 @@ AC_FUNC_FSEEKO
AC_FUNC_VPRINTF
AC_FUNC_FORK
AC_CHECK_FUNCS([atexit canonicalize_file_name clock_gettime ctermid \
- fcntl flockfile fsync ftello ftruncate funlockfile \
- getaddrinfo getenv getpagesize getpwnam getpwuid \
- getrlimit getrusage gettimeofday gmtime_r \
- inet_ntop inet_pton isascii lstat \
- memicmp memmove memrchr mmap nl_langinfo pipe \
- raise rand setenv setlocale setrlimit sigaction \
- sigprocmask stat stpcpy strcasecmp strerror strftime \
- stricmp strlwr strncasecmp strpbrk strsep \
- strtol strtoul strtoull tcgetattr timegm times \
- ttyname unsetenv wait4 waitpid ])
+ explicit_bzero fcntl flockfile fsync ftello \
+ ftruncate funlockfile getaddrinfo getenv getpagesize \
+ getpwnam getpwuid getrlimit getrusage gettimeofday \
+ gmtime_r inet_ntop inet_pton isascii lstat memicmp \
+ memmove memrchr mmap nl_langinfo pipe raise rand \
+ setenv setlocale setrlimit sigaction sigprocmask \
+ stat stpcpy strcasecmp strerror strftime stricmp \
+ strlwr strncasecmp strpbrk strsep strtol strtoul \
+ strtoull tcgetattr timegm times ttyname unsetenv \
+ wait4 waitpid ])
# On some systems (e.g. Solaris) nanosleep requires linking to librl.
# Given that we use nanosleep only as an optimization over a select
More information about the Gnupg-devel
mailing list