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