1 /*
2 * Copyright (c) 2016-2020 Apple Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28 #ifndef _SAN_MEMINTRINSICS_H_
29 #define _SAN_MEMINTRINSICS_H_
30
31 #include <sys/cdefs.h>
32
33 /*
34 * Non-sanitized versions of memory intrinsics
35 */
36 static inline void *
__nosan_memcpy(void * dst __sized_by (sz),const void * src __sized_by (sz),size_t sz)37 __nosan_memcpy(void *dst __sized_by(sz), const void *src __sized_by(sz), size_t sz)
38 {
39 return memcpy(dst, src, sz);
40 }
41 static inline void *
__nosan_memset(void * src __sized_by (sz),int c,size_t sz)42 __nosan_memset(void *src __sized_by(sz), int c, size_t sz)
43 {
44 return memset(src, c, sz);
45 }
46 static inline void *
__nosan_memmove(void * src __sized_by (sz),const void * dst __sized_by (sz),size_t sz)47 __nosan_memmove(void *src __sized_by(sz), const void *dst __sized_by(sz), size_t sz)
48 {
49 return memmove(src, dst, sz);
50 }
51 static inline int
__nosan_bcmp(const void * a __sized_by (sz),const void * b __sized_by (sz),size_t sz)52 __nosan_bcmp(const void *a __sized_by(sz), const void *b __sized_by(sz), size_t sz)
53 {
54 return bcmp(a, b, sz);
55 }
56 static inline void
__nosan_bcopy(const void * src __sized_by (sz),void * dst __sized_by (sz),size_t sz)57 __nosan_bcopy(const void *src __sized_by(sz), void *dst __sized_by(sz), size_t sz)
58 {
59 bcopy(src, dst, sz);
60 }
61 static inline int
__nosan_memcmp(const void * a __sized_by (sz),const void * b __sized_by (sz),size_t sz)62 __nosan_memcmp(const void *a __sized_by(sz), const void *b __sized_by(sz), size_t sz)
63 {
64 return memcmp(a, b, sz);
65 }
66 static inline void
__nosan_bzero(void * dst __sized_by (sz),size_t sz)67 __nosan_bzero(void *dst __sized_by(sz), size_t sz)
68 {
69 bzero(dst, sz);
70 }
71
72 static inline size_t
__nosan_strlcpy(char * __sized_by (sz)dst,const char * __null_terminated src,size_t sz)73 __nosan_strlcpy(char *__sized_by(sz)dst, const char *__null_terminated src, size_t sz)
74 {
75 return strlcpy(dst, src, sz);
76 }
77 static inline size_t
__nosan_strlcat(char * __sized_by (sz)dst,const char * __null_terminated src,size_t sz)78 __nosan_strlcat(char *__sized_by(sz)dst, const char *__null_terminated src, size_t sz)
79 {
80 return strlcat(dst, src, sz);
81 }
82 static inline size_t
__nosan_strnlen(const char * __counted_by (sz)src,size_t sz)83 __nosan_strnlen(const char *__counted_by(sz)src, size_t sz)
84 {
85 return strnlen(src, sz);
86 }
87 static inline size_t
__nosan_strlen(const char * __null_terminated src)88 __nosan_strlen(const char *__null_terminated src)
89 {
90 return strlen(src);
91 }
92 #if !__has_ptrcheck && !__has_include(<__xnu_libcxx_sentinel.h>)
93 static inline char *
__nosan_strncpy(char * dst,const char * src,size_t sz)94 __nosan_strncpy(char *dst, const char *src, size_t sz)
95 {
96 #ifdef __clang__
97 #pragma clang diagnostic push
98 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
99 #endif
100 return strncpy(dst, src, sz);
101 #ifdef __clang__
102 #pragma clang diagnostic pop
103 #endif
104 }
105 static inline char *
__nosan_strncat(char * dst,const char * src,size_t sz)106 __nosan_strncat(char *dst, const char *src, size_t sz)
107 {
108 #ifdef __clang__
109 #pragma clang diagnostic push
110 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
111 #endif
112 return strncat(dst, src, sz);
113 #ifdef __clang__
114 #pragma clang diagnostic pop
115 #endif
116 }
117 #endif /* !__has_ptrcheck && !__has_include(<__xnu_libcxx_sentinel.h>) */
118
119 #if KASAN
120 void *__asan_memcpy(void *src __sized_by(sz), const void *dst __sized_by(sz), size_t sz);
121 void *__asan_memset(void *src __sized_by(sz), int c, size_t sz);
122 void *__asan_memmove(void *src __sized_by(sz), const void *dst __sized_by(sz), size_t sz);
123 void __asan_bcopy(const void *src __sized_by(sz), void *dst __sized_by(sz), size_t sz);
124 void __asan_bzero(void *dst __sized_by(sz), size_t sz);
125 int __asan_bcmp(const void *a __sized_by(sz), const void *b __sized_by(sz), size_t sz);
126 int __asan_memcmp(const void *a __sized_by(sz), const void *b __sized_by(sz), size_t sz);
127
128 size_t __asan_strlcpy(char *__sized_by(sz) dst, const char *__null_terminated src, size_t sz);
129 char *__asan_strncpy(char *dst, const char *src, size_t sz);
130 char *__asan_strncat(char *dst, const char *src, size_t sz);
131 size_t __asan_strlcat(char *__sized_by(sz) dst, const char *__null_terminated src, size_t sz);
132 size_t __asan_strnlen(const char *__null_terminated src, size_t sz);
133 size_t __asan_strlen(const char *__null_terminated src);
134
135 #define memcpy __asan_memcpy
136 #define memmove __asan_memmove
137 #define memset __asan_memset
138 #define bcopy __asan_bcopy
139 #define bzero __asan_bzero
140 #define bcmp __asan_bcmp
141 #define memcmp __asan_memcmp
142
143 #define strlcpy __asan_strlcpy
144 #define strncpy __asan_strncpy
145 #define strlcat __asan_strlcat
146 #define strncat __asan_strncat
147 // #define strnlen __asan_strnlen
148 // #define strlen __asan_strlen
149
150 #endif
151
152 #endif /* _SAN_MEMINTRINSICS_H_ */
153