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:
@@ -351,6 +351,7 @@ AC_BROKEN([ \
|
|||||||
localtime_r \
|
localtime_r \
|
||||||
lstat \
|
lstat \
|
||||||
memmove \
|
memmove \
|
||||||
|
memset_s \
|
||||||
mkstemp \
|
mkstemp \
|
||||||
putenv \
|
putenv \
|
||||||
rcmd \
|
rcmd \
|
||||||
|
@@ -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
51
lib/roken/memset_s.c
Normal 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;
|
||||||
|
}
|
@@ -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)
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user