1 /*------------------------------------------------------------------ 2 * safe_mem_lib.h -- Safe C Library Memory APIs 3 * 4 * October 2008, Bo Berry 5 * Modified 2012, Jonathan Toppins <jtoppins@users.sourceforge.net> 6 * 7 * Copyright (c) 2008-2012 by Cisco Systems, Inc. 8 * All rights reserved. 9 * 10 * Permission is hereby granted, free of charge, to any person 11 * obtaining a copy of this software and associated documentation 12 * files (the "Software"), to deal in the Software without 13 * restriction, including without limitation the rights to use, 14 * copy, modify, merge, publish, distribute, sublicense, and/or 15 * sell copies of the Software, and to permit persons to whom the 16 * Software is furnished to do so, subject to the following 17 * conditions: 18 * 19 * The above copyright notice and this permission notice shall be 20 * included in all copies or substantial portions of the Software. 21 * 22 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 23 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 24 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 25 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 26 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 27 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 28 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 29 * OTHER DEALINGS IN THE SOFTWARE. 30 *------------------------------------------------------------------ 31 */ 32 33 #ifndef __SAFE_MEM_LIB_H__ 34 #define __SAFE_MEM_LIB_H__ 35 36 #include "safe_lib.h" 37 #include <wchar.h> 38 39 #define RSIZE_MAX_MEM ( 256UL << 20 ) /* 256MB */ 40 #define RSIZE_MAX_MEM16 ( RSIZE_MAX_MEM/2 ) 41 #define RSIZE_MAX_MEM32 ( RSIZE_MAX_MEM/4 ) 42 43 /* set memory constraint handler */ 44 extern constraint_handler_t 45 set_mem_constraint_handler_s(constraint_handler_t handler); 46 47 48 /* compare memory */ 49 extern errno_t memcmp_s(const void *dest, rsize_t dmax, 50 const void *src, rsize_t slen, int *diff); 51 52 /* compare uint16_t memory */ 53 extern errno_t memcmp16_s(const uint16_t *dest, rsize_t dmax, 54 const uint16_t *src, rsize_t slen, int *diff); 55 56 /* compare uint32_t memory */ 57 extern errno_t memcmp32_s(const uint32_t *dest, rsize_t dmax, 58 const uint32_t *src, rsize_t slen, int *diff); 59 60 /* wide compare memory */ 61 extern errno_t wmemcmp_s(const wchar_t *dest, rsize_t dmax, 62 const wchar_t *src, rsize_t smax, int *diff); 63 64 65 /* copy memory */ 66 extern errno_t memcpy_s(void *dest, rsize_t dmax, 67 const void *src, rsize_t slen); 68 69 /* copy uint16_t memory */ 70 extern errno_t memcpy16_s(uint16_t *dest, rsize_t dmax, 71 const uint16_t *src, rsize_t slen); 72 73 /* copy uint32_t memory */ 74 extern errno_t memcpy32_s(uint32_t *dest, rsize_t dmax, 75 const uint32_t *src, rsize_t slen); 76 77 /* copy wchar_t memory */ 78 extern errno_t wmemcpy_s(wchar_t *dest, rsize_t dmax, 79 const wchar_t *src, rsize_t slen); 80 81 82 /* move memory, including overlapping memory */ 83 extern errno_t memmove_s(void *dest, rsize_t dmax, 84 const void *src, rsize_t slen); 85 86 /* uint16_t move memory, including overlapping memory */ 87 extern errno_t memmove16_s(uint16_t *dest, rsize_t dmax, 88 const uint16_t *src, rsize_t slen); 89 90 /* uint32_t move memory, including overlapping memory */ 91 extern errno_t memmove32_s(uint32_t *dest, rsize_t dmax, 92 const uint32_t *src, rsize_t slen); 93 94 /* copy wchar_t memory, including overlapping memory */ 95 extern errno_t wmemmove_s(wchar_t *dest, rsize_t dmax, 96 const wchar_t *src, rsize_t slen); 97 98 99 /* set bytes */ 100 /* NOTE: This name is changed from memset_s to memset8_s out because it does 101 * not match with the C11 declaration of memset_s on OSX. The upstream issue 102 * can be found here: 103 * https://github.com/intel/safestringlib/issues/14 104 */ 105 extern errno_t memset8_s(void *dest, rsize_t dmax, uint8_t value); 106 107 /* set uint16_t */ 108 extern errno_t memset16_s(uint16_t *dest, rsize_t dmax, uint16_t value); 109 110 /* set uint32_t */ 111 extern errno_t memset32_s(uint32_t *dest, rsize_t dmax, uint32_t value); 112 113 /* wide set bytes */ 114 extern errno_t wmemset_s(wchar_t *dest, wchar_t value, rsize_t len); 115 116 117 /* byte zero */ 118 extern errno_t memzero_s(void *dest, rsize_t dmax); 119 120 /* uint16_t zero */ 121 extern errno_t memzero16_s(uint16_t *dest, rsize_t dmax); 122 123 /* uint32_t zero */ 124 extern errno_t memzero32_s(uint32_t *dest, rsize_t dmax); 125 126 127 #endif /* __SAFE_MEM_LIB_H__ */ 128