xref: /xnu-8796.121.2/osfmk/libsa/string.h (revision c54f35ca767986246321eb901baf8f5ff7923f6a)
1*c54f35caSApple OSS Distributions /*
2*c54f35caSApple OSS Distributions  * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved.
3*c54f35caSApple OSS Distributions  *
4*c54f35caSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*c54f35caSApple OSS Distributions  *
6*c54f35caSApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*c54f35caSApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*c54f35caSApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*c54f35caSApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10*c54f35caSApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11*c54f35caSApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12*c54f35caSApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13*c54f35caSApple OSS Distributions  * terms of an Apple operating system software license agreement.
14*c54f35caSApple OSS Distributions  *
15*c54f35caSApple OSS Distributions  * Please obtain a copy of the License at
16*c54f35caSApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*c54f35caSApple OSS Distributions  *
18*c54f35caSApple OSS Distributions  * The Original Code and all software distributed under the License are
19*c54f35caSApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*c54f35caSApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*c54f35caSApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*c54f35caSApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*c54f35caSApple OSS Distributions  * Please see the License for the specific language governing rights and
24*c54f35caSApple OSS Distributions  * limitations under the License.
25*c54f35caSApple OSS Distributions  *
26*c54f35caSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*c54f35caSApple OSS Distributions  */
28*c54f35caSApple OSS Distributions /*
29*c54f35caSApple OSS Distributions  * NOTICE: This file was modified by McAfee Research in 2004 to introduce
30*c54f35caSApple OSS Distributions  * support for mandatory and extensible security protections.  This notice
31*c54f35caSApple OSS Distributions  * is included in support of clause 2.2 (b) of the Apple Public License,
32*c54f35caSApple OSS Distributions  * Version 2.0.
33*c54f35caSApple OSS Distributions  */
34*c54f35caSApple OSS Distributions /*
35*c54f35caSApple OSS Distributions  * HISTORY
36*c54f35caSApple OSS Distributions  * @OSF_COPYRIGHT@
37*c54f35caSApple OSS Distributions  */
38*c54f35caSApple OSS Distributions #ifndef _STRING_H_
39*c54f35caSApple OSS Distributions #define _STRING_H_      1
40*c54f35caSApple OSS Distributions 
41*c54f35caSApple OSS Distributions #ifdef MACH_KERNEL_PRIVATE
42*c54f35caSApple OSS Distributions #include <types.h>
43*c54f35caSApple OSS Distributions #else
44*c54f35caSApple OSS Distributions #include <sys/types.h>
45*c54f35caSApple OSS Distributions #endif
46*c54f35caSApple OSS Distributions #include <sys/cdefs.h>
47*c54f35caSApple OSS Distributions 
48*c54f35caSApple OSS Distributions __BEGIN_DECLS
49*c54f35caSApple OSS Distributions 
50*c54f35caSApple OSS Distributions #ifndef NULL
51*c54f35caSApple OSS Distributions #if defined (__cplusplus)
52*c54f35caSApple OSS Distributions #if __cplusplus >= 201103L
53*c54f35caSApple OSS Distributions #define NULL nullptr
54*c54f35caSApple OSS Distributions #else
55*c54f35caSApple OSS Distributions #define NULL 0
56*c54f35caSApple OSS Distributions #endif
57*c54f35caSApple OSS Distributions #else
58*c54f35caSApple OSS Distributions #define NULL ((void *)0)
59*c54f35caSApple OSS Distributions #endif
60*c54f35caSApple OSS Distributions #endif
61*c54f35caSApple OSS Distributions 
62*c54f35caSApple OSS Distributions /*
63*c54f35caSApple OSS Distributions  * Memory functions
64*c54f35caSApple OSS Distributions  *
65*c54f35caSApple OSS Distributions  *   int bcmp(const void *s1, const void *s2, size_t n);
66*c54f35caSApple OSS Distributions  *   int memcmp(const void *s1, const void *s2, size_t n);
67*c54f35caSApple OSS Distributions  *   int timingsafe_bcmp(const void *b1, const void *b2, size_t n);
68*c54f35caSApple OSS Distributions  *
69*c54f35caSApple OSS Distributions  *   void bzero(void *dst, size_t n);
70*c54f35caSApple OSS Distributions  *   void *memset(void *s, int c, size_t n);
71*c54f35caSApple OSS Distributions  *   int memset_s(void *s __sized_by(smax), size_t smax, int c, size_t n);
72*c54f35caSApple OSS Distributions  *
73*c54f35caSApple OSS Distributions  *   void bcopy(const void *src, void *dst, size_t n);
74*c54f35caSApple OSS Distributions  *   void *memcpy(void *dst, const void *src, size_t n);
75*c54f35caSApple OSS Distributions  *   void *memove(void *dst, const void *src, size_t n);
76*c54f35caSApple OSS Distributions  *
77*c54f35caSApple OSS Distributions  *
78*c54f35caSApple OSS Distributions  * String functions
79*c54f35caSApple OSS Distributions  *
80*c54f35caSApple OSS Distributions  *   size_t strlen(const char *s);
81*c54f35caSApple OSS Distributions  *   size_t strnlen(const char *s, size_t n);
82*c54f35caSApple OSS Distributions  *
83*c54f35caSApple OSS Distributions  *   int strcmp(const char *s1, const char *s2);
84*c54f35caSApple OSS Distributions  *   int strncmp(const char *s1, const char *s2, size_t n);
85*c54f35caSApple OSS Distributions  *   int strprefix(const char *s1, const char *s2) __stateful_pure;
86*c54f35caSApple OSS Distributions  *   int strcasecmp(const char *s1, const char *s2);
87*c54f35caSApple OSS Distributions  *   int strncasecmp(const char *s1, const char *s2, size_t n);
88*c54f35caSApple OSS Distributions  *
89*c54f35caSApple OSS Distributions  *   char *strchr(const char *s, int c);
90*c54f35caSApple OSS Distributions  *   char *strrchr(const char *s, int c);
91*c54f35caSApple OSS Distributions  *   char *strnstr(const char *s, const char *find, size_t slen);
92*c54f35caSApple OSS Distributions  *
93*c54f35caSApple OSS Distributions  *   size_t strlcpy(char *dst, const char *src, size_t n);
94*c54f35caSApple OSS Distributions  *   size_t strlcat(char *dst, const char *src, size_t n);
95*c54f35caSApple OSS Distributions  */
96*c54f35caSApple OSS Distributions 
97*c54f35caSApple OSS Distributions 
98*c54f35caSApple OSS Distributions /*
99*c54f35caSApple OSS Distributions  * _FORTIFY_SOURCE > 0 will enable checked memory/string functions.
100*c54f35caSApple OSS Distributions  *
101*c54f35caSApple OSS Distributions  * _FORTIFY_SOURCE_STRICT will enable stricter checking (optional)
102*c54f35caSApple OSS Distributions  * for memcpy/memmove/bcopy and will check that copies do not go
103*c54f35caSApple OSS Distributions  * past the end of a struct member.
104*c54f35caSApple OSS Distributions  */
105*c54f35caSApple OSS Distributions #if KASAN
106*c54f35caSApple OSS Distributions #  define XNU_USE_CHK_BUILTIN(n)        0
107*c54f35caSApple OSS Distributions #  define XNU_USE_STRING_BUILTIN(n)     0
108*c54f35caSApple OSS Distributions #elif defined (_FORTIFY_SOURCE) && _FORTIFY_SOURCE == 0
109*c54f35caSApple OSS Distributions #  define XNU_USE_CHK_BUILTIN(n)        0
110*c54f35caSApple OSS Distributions #  define XNU_USE_STRING_BUILTIN(n)     __has_builtin(__builtin_##n)
111*c54f35caSApple OSS Distributions #elif __has_ptrcheck
112*c54f35caSApple OSS Distributions #  define XNU_USE_CHK_BUILTIN(n)        0
113*c54f35caSApple OSS Distributions #  define XNU_USE_STRING_BUILTIN(n)     __has_builtin(__builtin_##n)
114*c54f35caSApple OSS Distributions #elif defined(__cplusplus) && __has_include(<__xnu_libcxx_sentinel.h>)
115*c54f35caSApple OSS Distributions #  define XNU_USE_CHK_BUILTIN(n)        0
116*c54f35caSApple OSS Distributions #  define XNU_USE_STRING_BUILTIN(n)     0
117*c54f35caSApple OSS Distributions #elif XNU_KERNEL_PRIVATE || defined(_FORTIFY_SOURCE_STRICT)
118*c54f35caSApple OSS Distributions #  define XNU_USE_CHK_BUILTIN(n)        __has_builtin(__builtin___##n##_chk)
119*c54f35caSApple OSS Distributions #  define XNU_USE_STRING_BUILTIN(n)     __has_builtin(__builtin_##n)
120*c54f35caSApple OSS Distributions #  define __xnu_bos_default(ptr)        __xnu_bos_strict(ptr)
121*c54f35caSApple OSS Distributions #else
122*c54f35caSApple OSS Distributions #  define XNU_USE_CHK_BUILTIN(n)        __has_builtin(__builtin___##n##_chk)
123*c54f35caSApple OSS Distributions #  define XNU_USE_STRING_BUILTIN(n)     __has_builtin(__builtin_##n)
124*c54f35caSApple OSS Distributions #  define __xnu_bos_default(ptr)        __xnu_bos_loose(ptr)
125*c54f35caSApple OSS Distributions #endif
126*c54f35caSApple OSS Distributions 
127*c54f35caSApple OSS Distributions #if __has_builtin(__builtin_dynamic_object_size)
128*c54f35caSApple OSS Distributions #  define __xnu_bos_loose(ptr)          __builtin_dynamic_object_size(ptr, 0)
129*c54f35caSApple OSS Distributions #  define __xnu_bos_strict(ptr)         __builtin_dynamic_object_size(ptr, 1)
130*c54f35caSApple OSS Distributions #else
131*c54f35caSApple OSS Distributions #  define __xnu_bos_loose(ptr)          __builtin_object_size(ptr, 0)
132*c54f35caSApple OSS Distributions #  define __xnu_bos_strict(ptr)         __builtin_object_size(ptr, 1)
133*c54f35caSApple OSS Distributions #endif
134*c54f35caSApple OSS Distributions 
135*c54f35caSApple OSS Distributions 
136*c54f35caSApple OSS Distributions #pragma mark memory functions
137*c54f35caSApple OSS Distributions 
138*c54f35caSApple OSS Distributions extern int bcmp(const void *s1 __sized_by(n), const void *s2 __sized_by(n), size_t n) __stateful_pure;
139*c54f35caSApple OSS Distributions #if XNU_USE_STRING_BUILTIN(bcmp)
140*c54f35caSApple OSS Distributions #define bcmp(s1, s2, n)                 __builtin_bcmp(s1, s2, n)
141*c54f35caSApple OSS Distributions #endif
142*c54f35caSApple OSS Distributions 
143*c54f35caSApple OSS Distributions 
144*c54f35caSApple OSS Distributions extern int memcmp(const void *s1 __sized_by(n), const void *s2 __sized_by(n), size_t n) __stateful_pure;
145*c54f35caSApple OSS Distributions #if XNU_USE_STRING_BUILTIN(memcmp)
146*c54f35caSApple OSS Distributions #define memcmp(s1, s2, n)               __builtin_memcmp(s1, s2, n)
147*c54f35caSApple OSS Distributions #endif
148*c54f35caSApple OSS Distributions 
149*c54f35caSApple OSS Distributions 
150*c54f35caSApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE
151*c54f35caSApple OSS Distributions /*
152*c54f35caSApple OSS Distributions  * memcmp_zero_ptr_aligned() checks string s of n bytes contains all zeros.
153*c54f35caSApple OSS Distributions  * Address and size of the string s must be pointer-aligned.
154*c54f35caSApple OSS Distributions  * Return 0 if true, 1 otherwise. Also return 0 if n is 0.
155*c54f35caSApple OSS Distributions  */
156*c54f35caSApple OSS Distributions extern unsigned long memcmp_zero_ptr_aligned(const void *s __sized_by(n), size_t n) __stateful_pure;
157*c54f35caSApple OSS Distributions #endif
158*c54f35caSApple OSS Distributions 
159*c54f35caSApple OSS Distributions 
160*c54f35caSApple OSS Distributions extern int timingsafe_bcmp(const void *b1 __sized_by(n), const void *b2 __sized_by(n), size_t n);
161*c54f35caSApple OSS Distributions 
162*c54f35caSApple OSS Distributions 
163*c54f35caSApple OSS Distributions extern void bzero(void *s __sized_by(n), size_t n);
164*c54f35caSApple OSS Distributions #if XNU_USE_STRING_BUILTIN(bzero)
165*c54f35caSApple OSS Distributions #define bzero(s, n)                     __builtin_bzero(s, n)
166*c54f35caSApple OSS Distributions #endif
167*c54f35caSApple OSS Distributions 
168*c54f35caSApple OSS Distributions 
169*c54f35caSApple OSS Distributions extern void *memset(void *s __sized_by(n), int c, size_t n);
170*c54f35caSApple OSS Distributions #if XNU_USE_CHK_BUILTIN(memset) && XNU_KERNEL_PRIVATE /* rdar://103270898&103281379 */
171*c54f35caSApple OSS Distributions #define memset(s, c, n)                 __builtin___memset_chk(s, c, n, __xnu_bos_default(s))
172*c54f35caSApple OSS Distributions #elif XNU_USE_STRING_BUILTIN(memset) && XNU_KERNEL_PRIVATE
173*c54f35caSApple OSS Distributions #define memset(s, c, n)                 __builtin_memset(s, c, n)
174*c54f35caSApple OSS Distributions #endif
175*c54f35caSApple OSS Distributions 
176*c54f35caSApple OSS Distributions 
177*c54f35caSApple OSS Distributions extern int memset_s(void *s __sized_by(smax), size_t smax, int c, size_t n);
178*c54f35caSApple OSS Distributions 
179*c54f35caSApple OSS Distributions 
180*c54f35caSApple OSS Distributions extern void *memcpy(void *dst __sized_by(n), const void *src __sized_by(n), size_t n);
181*c54f35caSApple OSS Distributions #if XNU_USE_CHK_BUILTIN(memcpy)
182*c54f35caSApple OSS Distributions #define memcpy(dst, src, n)             __builtin___memcpy_chk(dst, src, n, __xnu_bos_default(dst))
183*c54f35caSApple OSS Distributions #define __nochk_memcpy(dst, src, n)     __builtin___memcpy_chk(dst, src, n, __xnu_bos_loose(dst))
184*c54f35caSApple OSS Distributions #elif XNU_USE_STRING_BUILTIN(memcpy)
185*c54f35caSApple OSS Distributions #define memcpy(dst, src, n)             __builtin_memcpy(dst, src, n)
186*c54f35caSApple OSS Distributions #define __nochk_memcpy(dst, src, n)     memcpy(dst, src, n)
187*c54f35caSApple OSS Distributions #else
188*c54f35caSApple OSS Distributions #define __nochk_memcpy(dst, src, n)     memcpy(dst, src, n)
189*c54f35caSApple OSS Distributions #endif
190*c54f35caSApple OSS Distributions 
191*c54f35caSApple OSS Distributions 
192*c54f35caSApple OSS Distributions extern void *memmove(void *dst __sized_by(n), const void *src __sized_by(n), size_t n);
193*c54f35caSApple OSS Distributions extern void bcopy(const void *src __sized_by(n), void *dst __sized_by(n), size_t n);
194*c54f35caSApple OSS Distributions #if XNU_USE_CHK_BUILTIN(memmove)
195*c54f35caSApple OSS Distributions #define memmove(dst, src, n)            __builtin___memmove_chk(dst, src, n, __xnu_bos_default(dst))
196*c54f35caSApple OSS Distributions #define bcopy(src, dst, n)              __builtin___memmove_chk(dst, src, n, __xnu_bos_default(dst))
197*c54f35caSApple OSS Distributions #define __nochk_memmove(dst, src, n)    __builtin___memmove_chk(dst, src, n, __xnu_bos_loose(dst))
198*c54f35caSApple OSS Distributions #define __nochk_bcopy(src, dst, n)      __builtin___memmove_chk(dst, src, n, __xnu_bos_loose(dst))
199*c54f35caSApple OSS Distributions #elif XNU_USE_STRING_BUILTIN(memmove)
200*c54f35caSApple OSS Distributions #define memmove(dst, src, n)            __builtin_memmove(dst, src, n)
201*c54f35caSApple OSS Distributions #define bcopy(src, dst, n)              __builtin_memmove(dst, src, n)
202*c54f35caSApple OSS Distributions #define __nochk_memmove(dst, src, n)    memmove(dst, src, n)
203*c54f35caSApple OSS Distributions #define __nochk_bcopy(src, dst, n)      bcopy(src, dst, n)
204*c54f35caSApple OSS Distributions #else
205*c54f35caSApple OSS Distributions #define __nochk_memmove(dst, src, n)    memmove(dst, src, n)
206*c54f35caSApple OSS Distributions #define __nochk_bcopy(src, dst, n)      bcopy(src, dst, n)
207*c54f35caSApple OSS Distributions #endif /* !XNU_USE_CHK_BUILTIN(memmove) */
208*c54f35caSApple OSS Distributions 
209*c54f35caSApple OSS Distributions 
210*c54f35caSApple OSS Distributions #pragma mark string functions
211*c54f35caSApple OSS Distributions 
212*c54f35caSApple OSS Distributions extern size_t strlen(const char *__null_terminated s) __stateful_pure;
213*c54f35caSApple OSS Distributions #if XNU_USE_STRING_BUILTIN(strlen)
214*c54f35caSApple OSS Distributions #define strlen(s)                       __builtin_strlen(s)
215*c54f35caSApple OSS Distributions #endif
216*c54f35caSApple OSS Distributions 
217*c54f35caSApple OSS Distributions 
218*c54f35caSApple OSS Distributions extern size_t strnlen(const char *__null_terminated s, size_t n) __stateful_pure;
219*c54f35caSApple OSS Distributions #if XNU_USE_STRING_BUILTIN(strnlen)
220*c54f35caSApple OSS Distributions #define strnlen(s, n)                   __builtin_strnlen(s, n)
221*c54f35caSApple OSS Distributions #endif
222*c54f35caSApple OSS Distributions 
223*c54f35caSApple OSS Distributions 
224*c54f35caSApple OSS Distributions extern int strcmp(const char *__null_terminated s1, const char *__null_terminated s2) __stateful_pure;
225*c54f35caSApple OSS Distributions #if XNU_USE_STRING_BUILTIN(strcmp)
226*c54f35caSApple OSS Distributions #define strcmp(s1, s2)                  __builtin_strcmp(s1, s2)
227*c54f35caSApple OSS Distributions #endif
228*c54f35caSApple OSS Distributions 
229*c54f35caSApple OSS Distributions 
230*c54f35caSApple OSS Distributions extern int strncmp(const char *__null_terminated s1, const char *__null_terminated s2, size_t n) __stateful_pure;
231*c54f35caSApple OSS Distributions #if XNU_USE_STRING_BUILTIN(strncmp)
232*c54f35caSApple OSS Distributions #define strncmp(s1, s2, n)              __builtin_strncmp(s1, s2, n)
233*c54f35caSApple OSS Distributions #endif
234*c54f35caSApple OSS Distributions 
235*c54f35caSApple OSS Distributions 
236*c54f35caSApple OSS Distributions extern int strprefix(const char *__null_terminated s1, const char *__null_terminated s2) __stateful_pure;
237*c54f35caSApple OSS Distributions 
238*c54f35caSApple OSS Distributions 
239*c54f35caSApple OSS Distributions extern int strcasecmp(const char *__null_terminated s1, const char *__null_terminated s2) __stateful_pure;
240*c54f35caSApple OSS Distributions #if XNU_USE_STRING_BUILTIN(strcasecmp)
241*c54f35caSApple OSS Distributions #define strcasecmp(s1, s2)              __builtin_strcasecmp(s1, s2)
242*c54f35caSApple OSS Distributions #endif
243*c54f35caSApple OSS Distributions 
244*c54f35caSApple OSS Distributions 
245*c54f35caSApple OSS Distributions extern int strncasecmp(const char *__null_terminated s1, const char *__null_terminated s2, size_t n) __stateful_pure;
246*c54f35caSApple OSS Distributions #if XNU_USE_STRING_BUILTIN(strncasecmp)
247*c54f35caSApple OSS Distributions #define strncasecmp(s1, s2, n)          __builtin_strncasecmp(s1, s2, n)
248*c54f35caSApple OSS Distributions #endif
249*c54f35caSApple OSS Distributions 
250*c54f35caSApple OSS Distributions 
251*c54f35caSApple OSS Distributions extern char *__null_terminated strchr(const char *__null_terminated s, int c) __stateful_pure;
252*c54f35caSApple OSS Distributions #if XNU_USE_STRING_BUILTIN(strchr) && !__has_ptrcheck /* rdar://103265304 */
253*c54f35caSApple OSS Distributions #define strchr(s, c)                    __builtin_strchr(s, c)
254*c54f35caSApple OSS Distributions #endif
255*c54f35caSApple OSS Distributions 
256*c54f35caSApple OSS Distributions 
257*c54f35caSApple OSS Distributions #if XNU_KERNEL_PRIVATE /* rdar://103276672 */
258*c54f35caSApple OSS Distributions extern char *__null_terminated strrchr(const char *__null_terminated s, int c) __stateful_pure;
259*c54f35caSApple OSS Distributions #if XNU_USE_STRING_BUILTIN(strrchr) && !__has_ptrcheck /* rdar://103265304 */
260*c54f35caSApple OSS Distributions #define strrchr(s, c)                   __builtin_strrchr(s, c)
261*c54f35caSApple OSS Distributions #endif
262*c54f35caSApple OSS Distributions #endif
263*c54f35caSApple OSS Distributions 
264*c54f35caSApple OSS Distributions 
265*c54f35caSApple OSS Distributions extern char *__null_terminated strnstr(const char *__null_terminated s, const char *__null_terminated find, size_t slen) __stateful_pure;
266*c54f35caSApple OSS Distributions #if XNU_USE_STRING_BUILTIN(strnstr) && !__has_ptrcheck /* rdar://103265304 */
267*c54f35caSApple OSS Distributions #define strnstr(s, find, slen)          __builtin_strnstr(s, find, slen)
268*c54f35caSApple OSS Distributions #endif
269*c54f35caSApple OSS Distributions 
270*c54f35caSApple OSS Distributions 
271*c54f35caSApple OSS Distributions extern size_t strlcpy(char *__sized_by(n) dst, const char *__null_terminated src, size_t n);
272*c54f35caSApple OSS Distributions #if XNU_USE_CHK_BUILTIN(strlcpy)
273*c54f35caSApple OSS Distributions #define strlcpy(dst, src, n)            __builtin___strlcpy_chk(dst, src, n, __xnu_bos_strict(dst))
274*c54f35caSApple OSS Distributions #elif XNU_USE_STRING_BUILTIN(strlcpy)
275*c54f35caSApple OSS Distributions #define strlcpy(dst, src, n)            __builtin_strlcpy(dst, src, n)
276*c54f35caSApple OSS Distributions #endif
277*c54f35caSApple OSS Distributions 
278*c54f35caSApple OSS Distributions 
279*c54f35caSApple OSS Distributions extern size_t strlcat(char *__sized_by(n) dst, const char *__null_terminated src, size_t n);
280*c54f35caSApple OSS Distributions #if XNU_USE_CHK_BUILTIN(strlcat)
281*c54f35caSApple OSS Distributions #define strlcat(dst, src, n)            __builtin___strlcat_chk(dst, src, n, __xnu_bos_strict(dst))
282*c54f35caSApple OSS Distributions #elif XNU_USE_STRING_BUILTIN(strlcat)
283*c54f35caSApple OSS Distributions #define strlcat(dst, src, n)            __builtin_strlcat(dst, src, n)
284*c54f35caSApple OSS Distributions #endif
285*c54f35caSApple OSS Distributions 
286*c54f35caSApple OSS Distributions 
287*c54f35caSApple OSS Distributions #pragma mark deprecated functions
288*c54f35caSApple OSS Distributions #if !__has_ptrcheck
289*c54f35caSApple OSS Distributions 
290*c54f35caSApple OSS Distributions /*
291*c54f35caSApple OSS Distributions  * char *strncat(char *dst, const char *src, size_t n);
292*c54f35caSApple OSS Distributions  * char *strncpy(char *dst, const char *src, size_t n);
293*c54f35caSApple OSS Distributions  *
294*c54f35caSApple OSS Distributions  * char *strcat(char *dst, const char *src);
295*c54f35caSApple OSS Distributions  * char *strcpy(char *, const char *);
296*c54f35caSApple OSS Distributions  *
297*c54f35caSApple OSS Distributions  * char *STRDUP(const char *, int);
298*c54f35caSApple OSS Distributions  */
299*c54f35caSApple OSS Distributions 
300*c54f35caSApple OSS Distributions __deprecated_msg("use strlcat")
301*c54f35caSApple OSS Distributions __kpi_deprecated_arm64_macos_unavailable
302*c54f35caSApple OSS Distributions extern char *strncat(char *dst, const char *src, size_t n);
303*c54f35caSApple OSS Distributions #if XNU_USE_CHK_BUILTIN(strncat)
304*c54f35caSApple OSS Distributions #define strncat(dst, src, n)            __builtin___strncat_chk(dst, src, n, __xnu_bos_strict(dst))
305*c54f35caSApple OSS Distributions #endif
306*c54f35caSApple OSS Distributions 
307*c54f35caSApple OSS Distributions 
308*c54f35caSApple OSS Distributions __deprecated_msg("use strlcpy")
309*c54f35caSApple OSS Distributions __kpi_deprecated_arm64_macos_unavailable
310*c54f35caSApple OSS Distributions extern char *strncpy(char *dst, const char *src, size_t n);
311*c54f35caSApple OSS Distributions #if XNU_USE_CHK_BUILTIN(strncpy)
312*c54f35caSApple OSS Distributions #define strncpy(dst, src, n)            __builtin___strncpy_chk(dst, src, n, __xnu_bos_strict(dst))
313*c54f35caSApple OSS Distributions #endif
314*c54f35caSApple OSS Distributions 
315*c54f35caSApple OSS Distributions __deprecated_msg("use strlcpy")
316*c54f35caSApple OSS Distributions __kpi_deprecated_arm64_macos_unavailable
317*c54f35caSApple OSS Distributions extern char *strcpy(char *, const char *);
318*c54f35caSApple OSS Distributions #if XNU_USE_CHK_BUILTIN(strcpy)
319*c54f35caSApple OSS Distributions /* rdar://103287225 */
320*c54f35caSApple OSS Distributions #define strcpy(dst, src, len)           __builtin___strcpy_chk(dst, src, __xnu_bos_strict(dst))
321*c54f35caSApple OSS Distributions #endif
322*c54f35caSApple OSS Distributions 
323*c54f35caSApple OSS Distributions __deprecated_msg("use strlcat")
324*c54f35caSApple OSS Distributions __kpi_deprecated_arm64_macos_unavailable
325*c54f35caSApple OSS Distributions extern char *strcat(char *dst, const char *src);
326*c54f35caSApple OSS Distributions #if XNU_USE_CHK_BUILTIN(strcat)
327*c54f35caSApple OSS Distributions #define strcat(dst, src)                __builtin___strcat_chk(dst, src, __xnu_bos_strict(dst))
328*c54f35caSApple OSS Distributions #endif
329*c54f35caSApple OSS Distributions 
330*c54f35caSApple OSS Distributions #if XNU_PLATFORM_MacOSX
331*c54f35caSApple OSS Distributions #ifndef KERNEL_PRIVATE
332*c54f35caSApple OSS Distributions extern char *STRDUP(const char *, int);
333*c54f35caSApple OSS Distributions #endif
334*c54f35caSApple OSS Distributions #endif /* XNU_PLATFORM_MacOSX */
335*c54f35caSApple OSS Distributions 
336*c54f35caSApple OSS Distributions #endif /* !__has_ptrcheck */
337*c54f35caSApple OSS Distributions 
338*c54f35caSApple OSS Distributions #if __has_include(<san/memintrinsics.h>)
339*c54f35caSApple OSS Distributions #include <san/memintrinsics.h>
340*c54f35caSApple OSS Distributions #endif
341*c54f35caSApple OSS Distributions 
342*c54f35caSApple OSS Distributions __END_DECLS
343*c54f35caSApple OSS Distributions 
344*c54f35caSApple OSS Distributions #endif  /* _STRING_H_ */
345