[PATCH 1/2] common/mischelp: use memset for wipememory

Jussi Kivilinna jussi.kivilinna at iki.fi
Fri Nov 9 17:48:07 CET 2018


* common/mischelp.h (wipememory2): Replace macro with function
prototype.
* common/mischelp.c (wipememory2): New.
--

In new wipememory2 function, 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>
---
 common/mischelp.c |   10 ++++++++++
 common/mischelp.h |   12 ++++--------
 2 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/common/mischelp.c b/common/mischelp.c
index 75ba60714..008aaab55 100644
--- a/common/mischelp.c
+++ b/common/mischelp.c
@@ -49,6 +49,16 @@
 #include "mischelp.h"
 
 
+void
+wipememory2 (void *ptr, int set, size_t len)
+{
+  /* 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, set, len);
+}
+
+
 /* 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..2554c2160 100644
--- a/common/mischelp.h
+++ b/common/mischelp.h
@@ -47,14 +47,10 @@ 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 and macro may be used instead.  */
+void wipememory2(void *ptr, int set, size_t len);
+#define wipememory(_ptr,_len) wipememory2((_ptr),0,(_len))
 
 
 /* Include hacks which are mainly required for Slowaris.  */




More information about the Gnupg-devel mailing list