roken: Add memset_s implementation
authorSimon Wilkinson <sxw@your-file-system.com>
Thu, 5 Mar 2015 10:34:09 +0000 (10:34 +0000)
committerSimon Wilkinson <sxw@your-file-system.com>
Thu, 5 Mar 2015 17:06:20 +0000 (17:06 +0000)
Add an implementation of memset_s to roken.

Some optimising compilers may remove the memset() instruction when it
is used immediately before a free, which defeats its purpose if the
intention is to zero memory before returning it to the heap or stack.

C11 added memset_s, provide a fallback in roken so that memset_s can
be used on all platforms.

cf/roken-frag.m4
lib/roken/NTMakefile
lib/roken/memset_s.c [new file with mode: 0644]
lib/roken/roken.h.in
lib/roken/version-script.map

index 12d3a5ffa403496878228cb918c618606378045b..e4db259cebf172d60c27622951558feb8860b1ff 100644 (file)
@@ -351,6 +351,7 @@ AC_BROKEN([                                 \
        localtime_r                             \
        lstat                                   \
        memmove                                 \
+       memset_s                                \
        mkstemp                                 \
        putenv                                  \
        rcmd                                    \
index 17e23259c016d837a245ee82f847be0fa1f98789..30c72d66d95871bef1cbbc16de61062e24f9a056 100644 (file)
@@ -69,6 +69,7 @@ libroken_la_OBJS =                    \
        $(OBJ)\issuid.obj               \
        $(OBJ)\localtime_r.obj          \
        $(OBJ)\lstat.obj                \
+       $(OBJ)\memset_s.obj             \
        $(OBJ)\mkdir.obj                \
        $(OBJ)\mini_inetd.obj           \
        $(OBJ)\mkstemp.obj              \
diff --git a/lib/roken/memset_s.c b/lib/roken/memset_s.c
new file mode 100644 (file)
index 0000000..207fe19
--- /dev/null
@@ -0,0 +1,51 @@
+/***********************************************************************
+ * Copyright (c) 2015, Your File System Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ **********************************************************************/
+
+#include <config.h>
+#include "roken.h"
+
+int ROKEN_LIB_FUNCTION
+memset_s(void *s, size_t smax, int c, size_t n)
+{
+    volatile unsigned char *p = s;
+
+#ifdef _WIN32
+    if (c == 0) {
+       SecureZeroMemory(s, n);
+       return 0;
+    }
+#endif
+
+    while (n--) 
+       *p++ = c; 
+
+    return 0;
+}
index cc5e827cc329e00edab28175087ca2ffe70a58e8..46449b2482bae35c2828b859ac6a15f3091f1d5b 100644 (file)
@@ -697,6 +697,7 @@ ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rk_rename(const char *, const char *);
 #define rk_mkdir(__rk_rn_name, __rk_rn_mode) mkdir(__rk_rn_name,__rk_rn_mode)
 #endif
 
+
 #if !defined(HAVE_DAEMON) || defined(NEED_DAEMON_PROTO)
 #ifndef HAVE_DAEMON
 #define daemon rk_daemon
@@ -1176,6 +1177,12 @@ void
 rk_qsort(void *, size_t, size_t, int (*)(const void *, const void *));
 #endif
 
+#ifndef HAVE_MEMSET_S
+#define memset_s rk_memset_s
+ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL memset_s(void *s, size_t smax,
+                                       int c, size_t n);
+#endif
+
 #if defined(HAVE_ARC4RANDOM)
 #define rk_random() arc4random()
 #elif defined(HAVE_RANDOM)
index cffaeaa82886d46f96b020baf9888738592c5e8f..d396b3041c23655e2292fe16113013e9af7b89b6 100644 (file)
@@ -80,6 +80,7 @@ HEIMDAL_ROKEN_1.0 {
                rk_inet_ntop;
                rk_inet_pton;
                rk_localtime_r;
+               rk_memset_s;
                rk_mkdir;
                rk_mkstemp;
                rk_pid_file_delete;