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				\ | ||||
| 	lstat					\ | ||||
| 	memmove					\ | ||||
| 	memset_s				\ | ||||
| 	mkstemp					\ | ||||
| 	putenv					\ | ||||
| 	rcmd					\ | ||||
|   | ||||
| @@ -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		\ | ||||
|   | ||||
							
								
								
									
										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) | ||||
| #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) | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Simon Wilkinson
					Simon Wilkinson