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