roken: Add memset_s implementation

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.
This commit is contained in:
Simon Wilkinson
2015-03-05 10:34:09 +00:00
parent 745eeb1252
commit 8485250989
5 changed files with 61 additions and 0 deletions

View File

@@ -351,6 +351,7 @@ AC_BROKEN([ \
localtime_r \ localtime_r \
lstat \ lstat \
memmove \ memmove \
memset_s \
mkstemp \ mkstemp \
putenv \ putenv \
rcmd \ rcmd \

View File

@@ -69,6 +69,7 @@ libroken_la_OBJS = \
$(OBJ)\issuid.obj \ $(OBJ)\issuid.obj \
$(OBJ)\localtime_r.obj \ $(OBJ)\localtime_r.obj \
$(OBJ)\lstat.obj \ $(OBJ)\lstat.obj \
$(OBJ)\memset_s.obj \
$(OBJ)\mkdir.obj \ $(OBJ)\mkdir.obj \
$(OBJ)\mini_inetd.obj \ $(OBJ)\mini_inetd.obj \
$(OBJ)\mkstemp.obj \ $(OBJ)\mkstemp.obj \

51
lib/roken/memset_s.c Normal file
View File

@@ -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;
}

View 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) #define rk_mkdir(__rk_rn_name, __rk_rn_mode) mkdir(__rk_rn_name,__rk_rn_mode)
#endif #endif
#if !defined(HAVE_DAEMON) || defined(NEED_DAEMON_PROTO) #if !defined(HAVE_DAEMON) || defined(NEED_DAEMON_PROTO)
#ifndef HAVE_DAEMON #ifndef HAVE_DAEMON
#define daemon rk_daemon #define daemon rk_daemon
@@ -1176,6 +1177,12 @@ void
rk_qsort(void *, size_t, size_t, int (*)(const void *, const void *)); rk_qsort(void *, size_t, size_t, int (*)(const void *, const void *));
#endif #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) #if defined(HAVE_ARC4RANDOM)
#define rk_random() arc4random() #define rk_random() arc4random()
#elif defined(HAVE_RANDOM) #elif defined(HAVE_RANDOM)

View File

@@ -80,6 +80,7 @@ HEIMDAL_ROKEN_1.0 {
rk_inet_ntop; rk_inet_ntop;
rk_inet_pton; rk_inet_pton;
rk_localtime_r; rk_localtime_r;
rk_memset_s;
rk_mkdir; rk_mkdir;
rk_mkstemp; rk_mkstemp;
rk_pid_file_delete; rk_pid_file_delete;