1*8d741a5dSApple OSS Distributions /*
2*8d741a5dSApple OSS Distributions * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved.
3*8d741a5dSApple OSS Distributions *
4*8d741a5dSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*8d741a5dSApple OSS Distributions *
6*8d741a5dSApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code
7*8d741a5dSApple OSS Distributions * as defined in and that are subject to the Apple Public Source License
8*8d741a5dSApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in
9*8d741a5dSApple OSS Distributions * compliance with the License. The rights granted to you under the License
10*8d741a5dSApple OSS Distributions * may not be used to create, or enable the creation or redistribution of,
11*8d741a5dSApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to
12*8d741a5dSApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any
13*8d741a5dSApple OSS Distributions * terms of an Apple operating system software license agreement.
14*8d741a5dSApple OSS Distributions *
15*8d741a5dSApple OSS Distributions * Please obtain a copy of the License at
16*8d741a5dSApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*8d741a5dSApple OSS Distributions *
18*8d741a5dSApple OSS Distributions * The Original Code and all software distributed under the License are
19*8d741a5dSApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*8d741a5dSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*8d741a5dSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*8d741a5dSApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*8d741a5dSApple OSS Distributions * Please see the License for the specific language governing rights and
24*8d741a5dSApple OSS Distributions * limitations under the License.
25*8d741a5dSApple OSS Distributions *
26*8d741a5dSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*8d741a5dSApple OSS Distributions */
28*8d741a5dSApple OSS Distributions /*
29*8d741a5dSApple OSS Distributions * NOTICE: This file was modified by McAfee Research in 2004 to introduce
30*8d741a5dSApple OSS Distributions * support for mandatory and extensible security protections. This notice
31*8d741a5dSApple OSS Distributions * is included in support of clause 2.2 (b) of the Apple Public License,
32*8d741a5dSApple OSS Distributions * Version 2.0.
33*8d741a5dSApple OSS Distributions */
34*8d741a5dSApple OSS Distributions /*
35*8d741a5dSApple OSS Distributions * HISTORY
36*8d741a5dSApple OSS Distributions * @OSF_COPYRIGHT@
37*8d741a5dSApple OSS Distributions */
38*8d741a5dSApple OSS Distributions
39*8d741a5dSApple OSS Distributions #if (defined(__has_include) && __has_include(<__xnu_libcxx_sentinel.h>) && !defined(XNU_LIBCXX_SDKROOT))
40*8d741a5dSApple OSS Distributions
41*8d741a5dSApple OSS Distributions #if !__has_include_next(<string.h>)
42*8d741a5dSApple OSS Distributions #error Do not build with -nostdinc (use GCC_USE_STANDARD_INCLUDE_SEARCHING=NO)
43*8d741a5dSApple OSS Distributions #endif /* !__has_include_next(<string.h>) */
44*8d741a5dSApple OSS Distributions
45*8d741a5dSApple OSS Distributions #include_next <string.h>
46*8d741a5dSApple OSS Distributions
47*8d741a5dSApple OSS Distributions #else /* (defined(__has_include) && __has_include(<__xnu_libcxx_sentinel.h>) && !defined(XNU_LIBCXX_SDKROOT)) */
48*8d741a5dSApple OSS Distributions
49*8d741a5dSApple OSS Distributions #ifndef _STRING_H_
50*8d741a5dSApple OSS Distributions #define _STRING_H_ 1
51*8d741a5dSApple OSS Distributions
52*8d741a5dSApple OSS Distributions #include <sys/cdefs.h>
53*8d741a5dSApple OSS Distributions #ifdef MACH_KERNEL_PRIVATE
54*8d741a5dSApple OSS Distributions #include <types.h>
55*8d741a5dSApple OSS Distributions #else /* MACH_KERNEL_PRIVATE */
56*8d741a5dSApple OSS Distributions #include <sys/types.h>
57*8d741a5dSApple OSS Distributions #endif /* MACH_KERNEL_PRIVATE */
58*8d741a5dSApple OSS Distributions
59*8d741a5dSApple OSS Distributions #ifdef KERNEL
60*8d741a5dSApple OSS Distributions #include <machine/trap.h>
61*8d741a5dSApple OSS Distributions #endif /* KERNEL */
62*8d741a5dSApple OSS Distributions
63*8d741a5dSApple OSS Distributions __BEGIN_DECLS
64*8d741a5dSApple OSS Distributions
65*8d741a5dSApple OSS Distributions #ifndef NULL
66*8d741a5dSApple OSS Distributions #if defined (__cplusplus)
67*8d741a5dSApple OSS Distributions #if __cplusplus >= 201103L
68*8d741a5dSApple OSS Distributions #define NULL nullptr
69*8d741a5dSApple OSS Distributions #else
70*8d741a5dSApple OSS Distributions #define NULL 0
71*8d741a5dSApple OSS Distributions #endif
72*8d741a5dSApple OSS Distributions #else
73*8d741a5dSApple OSS Distributions #define NULL ((void *)0)
74*8d741a5dSApple OSS Distributions #endif
75*8d741a5dSApple OSS Distributions #endif
76*8d741a5dSApple OSS Distributions
77*8d741a5dSApple OSS Distributions /*
78*8d741a5dSApple OSS Distributions * Memory functions
79*8d741a5dSApple OSS Distributions *
80*8d741a5dSApple OSS Distributions * int bcmp(const void *s1, const void *s2, size_t n);
81*8d741a5dSApple OSS Distributions * int memcmp(const void *s1, const void *s2, size_t n);
82*8d741a5dSApple OSS Distributions * int timingsafe_bcmp(const void *b1, const void *b2, size_t n);
83*8d741a5dSApple OSS Distributions *
84*8d741a5dSApple OSS Distributions * void bzero(void *dst, size_t n);
85*8d741a5dSApple OSS Distributions * void *memset(void *s, int c, size_t n);
86*8d741a5dSApple OSS Distributions * int memset_s(void *s, size_t smax, int c, size_t n);
87*8d741a5dSApple OSS Distributions *
88*8d741a5dSApple OSS Distributions * void bcopy(const void *src, void *dst, size_t n);
89*8d741a5dSApple OSS Distributions * void *memcpy(void *dst, const void *src, size_t n);
90*8d741a5dSApple OSS Distributions * void *memove(void *dst, const void *src, size_t n);
91*8d741a5dSApple OSS Distributions *
92*8d741a5dSApple OSS Distributions *
93*8d741a5dSApple OSS Distributions * String functions
94*8d741a5dSApple OSS Distributions *
95*8d741a5dSApple OSS Distributions * size_t strlen(const char *s);
96*8d741a5dSApple OSS Distributions * size_t strnlen(const char *s, size_t n);
97*8d741a5dSApple OSS Distributions *
98*8d741a5dSApple OSS Distributions * int strcmp(const char *s1, const char *s2);
99*8d741a5dSApple OSS Distributions * int strncmp(const char *s1, const char *s2, size_t n);
100*8d741a5dSApple OSS Distributions * int strlcmp(const char *s1, const char *s2, size_t n);
101*8d741a5dSApple OSS Distributions * int strbufcmp(const char *s1, size_t n1, const char *s2, size_t n2);
102*8d741a5dSApple OSS Distributions * int strprefix(const char *s1, const char *s2);
103*8d741a5dSApple OSS Distributions * int strcasecmp(const char *s1, const char *s2);
104*8d741a5dSApple OSS Distributions * int strncasecmp(const char *s1, const char *s2, size_t n);
105*8d741a5dSApple OSS Distributions * int strlcasecmp(const char *s1, const char *s2, size_t n);
106*8d741a5dSApple OSS Distributions * int strbufcasecmp(const char *s1, size_t n1, const char *s2, size_t n2);
107*8d741a5dSApple OSS Distributions *
108*8d741a5dSApple OSS Distributions * char *strchr(const char *s, int c);
109*8d741a5dSApple OSS Distributions * char *strrchr(const char *s, int c);
110*8d741a5dSApple OSS Distributions * char *strnstr(const char *s, const char *find, size_t slen);
111*8d741a5dSApple OSS Distributions *
112*8d741a5dSApple OSS Distributions * size_t strlcpy(char *dst, const char *src, size_t n);
113*8d741a5dSApple OSS Distributions * const char *strbufcpy(char *dst, size_t dstlen, const char *src, size_t srclen);
114*8d741a5dSApple OSS Distributions * size_t strlcat(char *dst, const char *src, size_t n);
115*8d741a5dSApple OSS Distributions * const char *strbufcat(char *dst, size_t dstlen, const char *src, size_t srclen);
116*8d741a5dSApple OSS Distributions */
117*8d741a5dSApple OSS Distributions
118*8d741a5dSApple OSS Distributions
119*8d741a5dSApple OSS Distributions #pragma mark _FORTIFY_SOURCE helpers
120*8d741a5dSApple OSS Distributions
121*8d741a5dSApple OSS Distributions /*
122*8d741a5dSApple OSS Distributions * If _FORTIFY_SOURCE is undefined, it is assumed to be 1.
123*8d741a5dSApple OSS Distributions *
124*8d741a5dSApple OSS Distributions * _FORTIFY_SOURCE > 0 will enable checked memory/string functions.
125*8d741a5dSApple OSS Distributions *
126*8d741a5dSApple OSS Distributions * _FORTIFY_SOURCE_STRICT will enable stricter checking (optional)
127*8d741a5dSApple OSS Distributions * for memcpy/memmove/bcopy and will check that copies do not go
128*8d741a5dSApple OSS Distributions * past the end of a struct member.
129*8d741a5dSApple OSS Distributions */
130*8d741a5dSApple OSS Distributions #if KASAN
131*8d741a5dSApple OSS Distributions # define __XNU_FORTIFY_SOURCE 0 /* kasan is a superset */
132*8d741a5dSApple OSS Distributions #elif defined (_FORTIFY_SOURCE) && _FORTIFY_SOURCE == 0
133*8d741a5dSApple OSS Distributions # define __XNU_FORTIFY_SOURCE 0 /* forcefully disabled */
134*8d741a5dSApple OSS Distributions #elif XNU_KERNEL_PRIVATE || defined(_FORTIFY_SOURCE_STRICT)
135*8d741a5dSApple OSS Distributions # define __XNU_FORTIFY_SOURCE 2
136*8d741a5dSApple OSS Distributions #else
137*8d741a5dSApple OSS Distributions # define __XNU_FORTIFY_SOURCE 1
138*8d741a5dSApple OSS Distributions #endif
139*8d741a5dSApple OSS Distributions
140*8d741a5dSApple OSS Distributions /*
141*8d741a5dSApple OSS Distributions * The overloadable attribute is load bearing in two major ways:
142*8d741a5dSApple OSS Distributions * - __builtin_${function} from ${function} would be infinite recursion and UB,
143*8d741a5dSApple OSS Distributions * - we need to still expose the regular prototype for people wanting to take
144*8d741a5dSApple OSS Distributions * its address.
145*8d741a5dSApple OSS Distributions */
146*8d741a5dSApple OSS Distributions #define __xnu_string_inline \
147*8d741a5dSApple OSS Distributions static inline __attribute__((__always_inline__, __overloadable__))
148*8d741a5dSApple OSS Distributions
149*8d741a5dSApple OSS Distributions /*
150*8d741a5dSApple OSS Distributions * We want to allow certain functions like strlen() to constant fold
151*8d741a5dSApple OSS Distributions * at compile time (such as strlen("foo")).
152*8d741a5dSApple OSS Distributions *
153*8d741a5dSApple OSS Distributions * In order to do so, we need an overload that has a similar looking
154*8d741a5dSApple OSS Distributions * signature but is different from the regular function so that it can
155*8d741a5dSApple OSS Distributions * call its matching builtin without causing UB due to inifinite recursion.
156*8d741a5dSApple OSS Distributions * We abuse that the pass_object_size class of attributes gives us
157*8d741a5dSApple OSS Distributions * precisely that semantics.
158*8d741a5dSApple OSS Distributions */
159*8d741a5dSApple OSS Distributions #define __xnu_force_overload __xnu_pass_object_size
160*8d741a5dSApple OSS Distributions
161*8d741a5dSApple OSS Distributions /*
162*8d741a5dSApple OSS Distributions * The object_size extension defines two kinds of size: the "struct size" and
163*8d741a5dSApple OSS Distributions * the "member size". The "struct size" is the size of the buffer from the
164*8d741a5dSApple OSS Distributions * starting address to the end of the largest enclosing object. The "member
165*8d741a5dSApple OSS Distributions * size" is the size of the buffer from the starting address to the end of the
166*8d741a5dSApple OSS Distributions * immediately enclosing array. For instance, given this:
167*8d741a5dSApple OSS Distributions *
168*8d741a5dSApple OSS Distributions * struct foo {
169*8d741a5dSApple OSS Distributions * char a[20];
170*8d741a5dSApple OSS Distributions * char b[20];
171*8d741a5dSApple OSS Distributions * } my_foo;
172*8d741a5dSApple OSS Distributions *
173*8d741a5dSApple OSS Distributions * The "struct size" for &my_foo.a[10] is 30 (`sizeof(struct foo) -
174*8d741a5dSApple OSS Distributions * offsetof(struct foo, a[10])`), and the "member size" for it is 10
175*8d741a5dSApple OSS Distributions * (`sizeof(my_foo.a) - 10`).
176*8d741a5dSApple OSS Distributions *
177*8d741a5dSApple OSS Distributions * In general, you should use the member size for string operations (as it is
178*8d741a5dSApple OSS Distributions * always a mistake to go out of bounds of a char buffer with a string
179*8d741a5dSApple OSS Distributions * operation) and the struct size for bytewise operations (like bcopy, bzero,
180*8d741a5dSApple OSS Distributions * memset, etc). The object_size extension is intended to provide _some_ bounds
181*8d741a5dSApple OSS Distributions * safety at a low engineering cost, and various patterns intentionally
182*8d741a5dSApple OSS Distributions * overflowing from individual fields with bytewise operations have
183*8d741a5dSApple OSS Distributions * historically been tolerated both by engineers and the compiler (despite
184*8d741a5dSApple OSS Distributions * probably being undefined).
185*8d741a5dSApple OSS Distributions *
186*8d741a5dSApple OSS Distributions * As an important side note, -fbounds-safety does not allow naïvely
187*8d741a5dSApple OSS Distributions * overflowing from individual fields. -fbounds-safety bounds checks are always
188*8d741a5dSApple OSS Distributions * equivalent to checks against the member size.
189*8d741a5dSApple OSS Distributions */
190*8d741a5dSApple OSS Distributions
191*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_dynamic_object_size)
192*8d741a5dSApple OSS Distributions # define __xnu_pass_struct_size __attribute__((__pass_dynamic_object_size__(0)))
193*8d741a5dSApple OSS Distributions # define __xnu_pass_member_size __attribute__((__pass_dynamic_object_size__(1)))
194*8d741a5dSApple OSS Distributions # define __xnu_struct_size(ptr) __builtin_dynamic_object_size(ptr, 0)
195*8d741a5dSApple OSS Distributions # define __xnu_member_size(ptr) __builtin_dynamic_object_size(ptr, 1)
196*8d741a5dSApple OSS Distributions #else
197*8d741a5dSApple OSS Distributions # define __xnu_pass_struct_size __attribute__((__pass_object_size__(0)))
198*8d741a5dSApple OSS Distributions # define __xnu_pass_member_size __attribute__((__pass_object_size__(1)))
199*8d741a5dSApple OSS Distributions # define __xnu_struct_size(ptr) __builtin_object_size(ptr, 0)
200*8d741a5dSApple OSS Distributions # define __xnu_member_size(ptr) __builtin_object_size(ptr, 1)
201*8d741a5dSApple OSS Distributions #endif
202*8d741a5dSApple OSS Distributions
203*8d741a5dSApple OSS Distributions #if __XNU_FORTIFY_SOURCE == 0 || !__has_attribute(diagnose_if)
204*8d741a5dSApple OSS Distributions # define __xnu_struct_size_precondition(ptr, size, message)
205*8d741a5dSApple OSS Distributions # define __xnu_member_size_precondition(ptr, size, message)
206*8d741a5dSApple OSS Distributions #else
207*8d741a5dSApple OSS Distributions # define __xnu_struct_size_precondition(ptr, size, message) \
208*8d741a5dSApple OSS Distributions __attribute__((__diagnose_if__(__xnu_struct_size(ptr) < (size), message, "error")))
209*8d741a5dSApple OSS Distributions # define __xnu_member_size_precondition(ptr, size, message) \
210*8d741a5dSApple OSS Distributions __attribute__((__diagnose_if__(__xnu_member_size(ptr) < (size), message, "error")))
211*8d741a5dSApple OSS Distributions #endif
212*8d741a5dSApple OSS Distributions
213*8d741a5dSApple OSS Distributions
214*8d741a5dSApple OSS Distributions #if __XNU_FORTIFY_SOURCE > 1
215*8d741a5dSApple OSS Distributions # define __xnu_object_size_precondition(...) \
216*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(__VA_ARGS__)
217*8d741a5dSApple OSS Distributions # define __xnu_object_size_check(...) \
218*8d741a5dSApple OSS Distributions __xnu_member_size_check(__VA_ARGS__)
219*8d741a5dSApple OSS Distributions # define __xnu_pass_object_size __xnu_pass_member_size
220*8d741a5dSApple OSS Distributions #else
221*8d741a5dSApple OSS Distributions # define __xnu_object_size_precondition(...) \
222*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(__VA_ARGS__)
223*8d741a5dSApple OSS Distributions # define __xnu_object_size_check(...) \
224*8d741a5dSApple OSS Distributions __xnu_struct_size_check(__VA_ARGS__)
225*8d741a5dSApple OSS Distributions # define __xnu_pass_object_size __xnu_pass_struct_size
226*8d741a5dSApple OSS Distributions #endif
227*8d741a5dSApple OSS Distributions
228*8d741a5dSApple OSS Distributions #if __XNU_FORTIFY_SOURCE == 0 || __has_ptrcheck
229*8d741a5dSApple OSS Distributions #define __xnu_struct_size_check(ptr, size, how) ((void)0)
230*8d741a5dSApple OSS Distributions #define __xnu_member_size_check(ptr, size, how) ((void)0)
231*8d741a5dSApple OSS Distributions #else
232*8d741a5dSApple OSS Distributions __xnu_string_inline __cold __dead2 void
233*8d741a5dSApple OSS Distributions __xnu_fortify_trap_write(void)
234*8d741a5dSApple OSS Distributions {
235*8d741a5dSApple OSS Distributions ml_fatal_trap(0xbffe); /* XNU_HARD_TRAP_STRING_CHK */
236*8d741a5dSApple OSS Distributions }
237*8d741a5dSApple OSS Distributions
238*8d741a5dSApple OSS Distributions __xnu_string_inline __cold void
239*8d741a5dSApple OSS Distributions __xnu_fortify_trap_read(void)
240*8d741a5dSApple OSS Distributions {
241*8d741a5dSApple OSS Distributions /* for now do not emit read traps yet */
242*8d741a5dSApple OSS Distributions #if 0
243*8d741a5dSApple OSS Distributions ml_recoverable_trap(0xfffe); /* XNU_SOFT_TRAP_STRING_CHK */
244*8d741a5dSApple OSS Distributions #endif
245*8d741a5dSApple OSS Distributions }
246*8d741a5dSApple OSS Distributions
247*8d741a5dSApple OSS Distributions #define __xnu_struct_size_check(ptr, size, how) ({ \
248*8d741a5dSApple OSS Distributions if (__xnu_struct_size(ptr) < (size)) { \
249*8d741a5dSApple OSS Distributions __xnu_fortify_trap_ ## how(); \
250*8d741a5dSApple OSS Distributions } \
251*8d741a5dSApple OSS Distributions })
252*8d741a5dSApple OSS Distributions #define __xnu_member_size_check(ptr, size, how) ({ \
253*8d741a5dSApple OSS Distributions if (__xnu_member_size(ptr) < (size)) { \
254*8d741a5dSApple OSS Distributions __xnu_fortify_trap_ ## how(); \
255*8d741a5dSApple OSS Distributions } \
256*8d741a5dSApple OSS Distributions })
257*8d741a5dSApple OSS Distributions #endif
258*8d741a5dSApple OSS Distributions
259*8d741a5dSApple OSS Distributions /*
260*8d741a5dSApple OSS Distributions * Verifies at compile-time that an expression is an array (of any type).
261*8d741a5dSApple OSS Distributions */
262*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_types_compatible_p)
263*8d741a5dSApple OSS Distributions #define __xnu_is_array(A) __builtin_types_compatible_p(typeof((A)[0])[], typeof(A))
264*8d741a5dSApple OSS Distributions #else
265*8d741a5dSApple OSS Distributions #define __xnu_is_array(A) 1
266*8d741a5dSApple OSS Distributions #endif
267*8d741a5dSApple OSS Distributions #define __xnu_assert_is_array(A, MSG) _Static_assert(__xnu_is_array(A), MSG)
268*8d741a5dSApple OSS Distributions
269*8d741a5dSApple OSS Distributions #define __xnu_count_args1(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, N, ...) N
270*8d741a5dSApple OSS Distributions #define __xnu_count_args(...) \
271*8d741a5dSApple OSS Distributions __xnu_count_args1(, ##__VA_ARGS__, _9, _8, _7, _6, _5, _4, _3, _2, _1, _0)
272*8d741a5dSApple OSS Distributions
273*8d741a5dSApple OSS Distributions #define __xnu_argc_overload1(base, N, ...) __CONCAT(base, N)(__VA_ARGS__)
274*8d741a5dSApple OSS Distributions #define __xnu_argc_overload(base, ...) \
275*8d741a5dSApple OSS Distributions __xnu_argc_overload1(base, __xnu_count_args(__VA_ARGS__), ##__VA_ARGS__)
276*8d741a5dSApple OSS Distributions
277*8d741a5dSApple OSS Distributions #pragma mark memory functions
278*8d741a5dSApple OSS Distributions
279*8d741a5dSApple OSS Distributions
280*8d741a5dSApple OSS Distributions extern int bcmp(const void *s1 __sized_by(n), const void *s2 __sized_by(n), size_t n) __stateful_pure;
281*8d741a5dSApple OSS Distributions
282*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
283*8d741a5dSApple OSS Distributions int
bcmp(const void * const s1 __xnu_pass_struct_size __sized_by (n),const void * const s2 __xnu_pass_struct_size __sized_by (n),size_t n)284*8d741a5dSApple OSS Distributions bcmp(
285*8d741a5dSApple OSS Distributions const void *const s1 __xnu_pass_struct_size __sized_by(n),
286*8d741a5dSApple OSS Distributions const void *const s2 __xnu_pass_struct_size __sized_by(n),
287*8d741a5dSApple OSS Distributions size_t n)
288*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(s1, n, "read overflow (first argument)")
289*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(s2, n, "read overflow (second argument)")
290*8d741a5dSApple OSS Distributions {
291*8d741a5dSApple OSS Distributions extern int __xnu_bcmp(
292*8d741a5dSApple OSS Distributions const void * __sized_by(n),
293*8d741a5dSApple OSS Distributions const void * __sized_by(n),
294*8d741a5dSApple OSS Distributions size_t n) __asm("_bcmp");
295*8d741a5dSApple OSS Distributions
296*8d741a5dSApple OSS Distributions __xnu_struct_size_check(s1, n, read);
297*8d741a5dSApple OSS Distributions __xnu_struct_size_check(s2, n, read);
298*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_bcmp)
299*8d741a5dSApple OSS Distributions return __builtin_bcmp(s1, s2, n);
300*8d741a5dSApple OSS Distributions #else
301*8d741a5dSApple OSS Distributions return __xnu_bcmp(s1, s2, n);
302*8d741a5dSApple OSS Distributions #endif
303*8d741a5dSApple OSS Distributions }
304*8d741a5dSApple OSS Distributions
305*8d741a5dSApple OSS Distributions
306*8d741a5dSApple OSS Distributions extern int memcmp(const void *s1 __sized_by(n), const void *s2 __sized_by(n), size_t n) __stateful_pure;
307*8d741a5dSApple OSS Distributions
308*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
309*8d741a5dSApple OSS Distributions int
memcmp(const void * const s1 __xnu_pass_struct_size __sized_by (n),const void * const s2 __xnu_pass_struct_size __sized_by (n),size_t n)310*8d741a5dSApple OSS Distributions memcmp(
311*8d741a5dSApple OSS Distributions const void *const s1 __xnu_pass_struct_size __sized_by(n),
312*8d741a5dSApple OSS Distributions const void *const s2 __xnu_pass_struct_size __sized_by(n),
313*8d741a5dSApple OSS Distributions size_t n)
314*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(s1, n, "read overflow (first argument)")
315*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(s2, n, "read overflow (second argument)")
316*8d741a5dSApple OSS Distributions {
317*8d741a5dSApple OSS Distributions extern int __xnu_memcmp(
318*8d741a5dSApple OSS Distributions const void *__sized_by(n),
319*8d741a5dSApple OSS Distributions const void *__sized_by(n),
320*8d741a5dSApple OSS Distributions size_t n) __asm("_memcmp");
321*8d741a5dSApple OSS Distributions
322*8d741a5dSApple OSS Distributions __xnu_struct_size_check(s1, n, read);
323*8d741a5dSApple OSS Distributions __xnu_struct_size_check(s2, n, read);
324*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_memcmp)
325*8d741a5dSApple OSS Distributions return __builtin_memcmp(s1, s2, n);
326*8d741a5dSApple OSS Distributions #else
327*8d741a5dSApple OSS Distributions return __xnu_memcmp(s1, s2, n);
328*8d741a5dSApple OSS Distributions #endif
329*8d741a5dSApple OSS Distributions }
330*8d741a5dSApple OSS Distributions
331*8d741a5dSApple OSS Distributions
332*8d741a5dSApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE
333*8d741a5dSApple OSS Distributions /*
334*8d741a5dSApple OSS Distributions * memcmp_zero_ptr_aligned() checks string s of n bytes contains all zeros.
335*8d741a5dSApple OSS Distributions * Address and size of the string s must be pointer-aligned.
336*8d741a5dSApple OSS Distributions * Return 0 if true, 1 otherwise. Also return 0 if n is 0.
337*8d741a5dSApple OSS Distributions */
338*8d741a5dSApple OSS Distributions extern unsigned long memcmp_zero_ptr_aligned(const void *s __sized_by(n), size_t n) __stateful_pure;
339*8d741a5dSApple OSS Distributions #endif
340*8d741a5dSApple OSS Distributions
341*8d741a5dSApple OSS Distributions
342*8d741a5dSApple OSS Distributions extern int timingsafe_bcmp(const void *b1 __sized_by(n), const void *b2 __sized_by(n), size_t n);
343*8d741a5dSApple OSS Distributions
344*8d741a5dSApple OSS Distributions
345*8d741a5dSApple OSS Distributions extern void bzero(void *s __sized_by(n), size_t n);
346*8d741a5dSApple OSS Distributions
347*8d741a5dSApple OSS Distributions __xnu_string_inline
348*8d741a5dSApple OSS Distributions void
bzero(void * const s __xnu_pass_struct_size __sized_by (n),size_t n)349*8d741a5dSApple OSS Distributions bzero(
350*8d741a5dSApple OSS Distributions void *const s __xnu_pass_struct_size __sized_by(n),
351*8d741a5dSApple OSS Distributions size_t n)
352*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(s, n, "write overflow")
353*8d741a5dSApple OSS Distributions {
354*8d741a5dSApple OSS Distributions extern void __xnu_bzero(
355*8d741a5dSApple OSS Distributions const void *__sized_by(n),
356*8d741a5dSApple OSS Distributions size_t n) __asm("_bzero");
357*8d741a5dSApple OSS Distributions
358*8d741a5dSApple OSS Distributions __xnu_struct_size_check(s, n, write);
359*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_bzero)
360*8d741a5dSApple OSS Distributions __builtin_bzero(s, n);
361*8d741a5dSApple OSS Distributions #else
362*8d741a5dSApple OSS Distributions __xnu_bzero(s, n);
363*8d741a5dSApple OSS Distributions #endif
364*8d741a5dSApple OSS Distributions }
365*8d741a5dSApple OSS Distributions
366*8d741a5dSApple OSS Distributions
367*8d741a5dSApple OSS Distributions extern void *memset(void *s __sized_by(n), int c, size_t n);
368*8d741a5dSApple OSS Distributions
369*8d741a5dSApple OSS Distributions __xnu_string_inline
370*8d741a5dSApple OSS Distributions void *
__sized_by(n)371*8d741a5dSApple OSS Distributions __sized_by(n)
372*8d741a5dSApple OSS Distributions memset(
373*8d741a5dSApple OSS Distributions void *const s __xnu_pass_object_size __sized_by(n),
374*8d741a5dSApple OSS Distributions int c,
375*8d741a5dSApple OSS Distributions size_t n)
376*8d741a5dSApple OSS Distributions __xnu_object_size_precondition(s, n, "write overflow")
377*8d741a5dSApple OSS Distributions {
378*8d741a5dSApple OSS Distributions extern void __xnu_memset(
379*8d741a5dSApple OSS Distributions void *__sized_by(n),
380*8d741a5dSApple OSS Distributions int,
381*8d741a5dSApple OSS Distributions size_t n) __asm("_memset");
382*8d741a5dSApple OSS Distributions
383*8d741a5dSApple OSS Distributions __xnu_object_size_check(s, n, write);
384*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_memset)
385*8d741a5dSApple OSS Distributions return __builtin_memset(s, c, n);
386*8d741a5dSApple OSS Distributions #else
387*8d741a5dSApple OSS Distributions return __xnu_memset(s, c, n);
388*8d741a5dSApple OSS Distributions #endif
389*8d741a5dSApple OSS Distributions }
390*8d741a5dSApple OSS Distributions
391*8d741a5dSApple OSS Distributions
392*8d741a5dSApple OSS Distributions extern int memset_s(void *s __sized_by(smax), size_t smax, int c, size_t n);
393*8d741a5dSApple OSS Distributions
394*8d741a5dSApple OSS Distributions
395*8d741a5dSApple OSS Distributions extern void *memmove(void *dst __sized_by(n), const void *src __sized_by(n), size_t n);
396*8d741a5dSApple OSS Distributions
397*8d741a5dSApple OSS Distributions __xnu_string_inline
398*8d741a5dSApple OSS Distributions void *
__sized_by(n)399*8d741a5dSApple OSS Distributions __sized_by(n)
400*8d741a5dSApple OSS Distributions memmove(
401*8d741a5dSApple OSS Distributions void *const dst __xnu_pass_object_size __sized_by(n),
402*8d741a5dSApple OSS Distributions const void *const src __xnu_pass_object_size __sized_by(n),
403*8d741a5dSApple OSS Distributions size_t n)
404*8d741a5dSApple OSS Distributions __xnu_object_size_precondition(dst, n, "write overflow")
405*8d741a5dSApple OSS Distributions __xnu_object_size_precondition(src, n, "read overflow")
406*8d741a5dSApple OSS Distributions {
407*8d741a5dSApple OSS Distributions extern void *__xnu_memmove(
408*8d741a5dSApple OSS Distributions void *dst __sized_by(n),
409*8d741a5dSApple OSS Distributions const void *src __sized_by(n),
410*8d741a5dSApple OSS Distributions size_t n) __asm("_memmove");
411*8d741a5dSApple OSS Distributions
412*8d741a5dSApple OSS Distributions __xnu_object_size_check(dst, n, write);
413*8d741a5dSApple OSS Distributions __xnu_object_size_check(src, n, read);
414*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_memmove)
415*8d741a5dSApple OSS Distributions return __builtin_memmove(dst, src, n);
416*8d741a5dSApple OSS Distributions #else
417*8d741a5dSApple OSS Distributions return __xnu_memmove(dst, src, n);
418*8d741a5dSApple OSS Distributions #endif
419*8d741a5dSApple OSS Distributions }
420*8d741a5dSApple OSS Distributions
421*8d741a5dSApple OSS Distributions __xnu_string_inline
422*8d741a5dSApple OSS Distributions void *
__sized_by(n)423*8d741a5dSApple OSS Distributions __sized_by(n)
424*8d741a5dSApple OSS Distributions __nochk_memmove(
425*8d741a5dSApple OSS Distributions void *const dst __xnu_pass_struct_size __sized_by(n),
426*8d741a5dSApple OSS Distributions const void *const src __xnu_pass_struct_size __sized_by(n),
427*8d741a5dSApple OSS Distributions size_t n)
428*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(dst, n, "write overflow")
429*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(src, n, "read overflow")
430*8d741a5dSApple OSS Distributions {
431*8d741a5dSApple OSS Distributions extern void *__xnu_memmove(
432*8d741a5dSApple OSS Distributions void *dst __sized_by(n),
433*8d741a5dSApple OSS Distributions const void *src __sized_by(n),
434*8d741a5dSApple OSS Distributions size_t n) __asm("_memmove");
435*8d741a5dSApple OSS Distributions
436*8d741a5dSApple OSS Distributions __xnu_struct_size_check(dst, n, write);
437*8d741a5dSApple OSS Distributions __xnu_struct_size_check(src, n, read);
438*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_memmove)
439*8d741a5dSApple OSS Distributions return __builtin_memmove(dst, src, n);
440*8d741a5dSApple OSS Distributions #else
441*8d741a5dSApple OSS Distributions return __xnu_memmove(dst, src, n);
442*8d741a5dSApple OSS Distributions #endif
443*8d741a5dSApple OSS Distributions }
444*8d741a5dSApple OSS Distributions
445*8d741a5dSApple OSS Distributions
446*8d741a5dSApple OSS Distributions extern void bcopy(const void *src __sized_by(n), void *dst __sized_by(n), size_t n);
447*8d741a5dSApple OSS Distributions
448*8d741a5dSApple OSS Distributions __xnu_string_inline
449*8d741a5dSApple OSS Distributions void
bcopy(const void * const src __xnu_pass_object_size __sized_by (n),void * const dst __xnu_pass_object_size __sized_by (n),size_t n)450*8d741a5dSApple OSS Distributions bcopy(
451*8d741a5dSApple OSS Distributions const void *const src __xnu_pass_object_size __sized_by(n),
452*8d741a5dSApple OSS Distributions void *const dst __xnu_pass_object_size __sized_by(n),
453*8d741a5dSApple OSS Distributions size_t n)
454*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(dst, n, "write overflow")
455*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(src, n, "read overflow")
456*8d741a5dSApple OSS Distributions {
457*8d741a5dSApple OSS Distributions (void)memmove(dst, src, n);
458*8d741a5dSApple OSS Distributions }
459*8d741a5dSApple OSS Distributions
460*8d741a5dSApple OSS Distributions __xnu_string_inline
461*8d741a5dSApple OSS Distributions void
__nochk_bcopy(const void * const src __xnu_pass_struct_size __sized_by (n),void * const dst __xnu_pass_struct_size __sized_by (n),size_t n)462*8d741a5dSApple OSS Distributions __nochk_bcopy(
463*8d741a5dSApple OSS Distributions const void *const src __xnu_pass_struct_size __sized_by(n),
464*8d741a5dSApple OSS Distributions void *const dst __xnu_pass_struct_size __sized_by(n),
465*8d741a5dSApple OSS Distributions size_t n)
466*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(dst, n, "write overflow")
467*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(src, n, "read overflow")
468*8d741a5dSApple OSS Distributions {
469*8d741a5dSApple OSS Distributions (void)__nochk_memmove(dst, src, n);
470*8d741a5dSApple OSS Distributions }
471*8d741a5dSApple OSS Distributions
472*8d741a5dSApple OSS Distributions
473*8d741a5dSApple OSS Distributions extern void *memcpy(void *dst __sized_by(n), const void *src __sized_by(n), size_t n);
474*8d741a5dSApple OSS Distributions
475*8d741a5dSApple OSS Distributions __xnu_string_inline
476*8d741a5dSApple OSS Distributions void *
__sized_by(n)477*8d741a5dSApple OSS Distributions __sized_by(n)
478*8d741a5dSApple OSS Distributions memcpy(
479*8d741a5dSApple OSS Distributions void *const dst __xnu_pass_object_size __sized_by(n),
480*8d741a5dSApple OSS Distributions const void *const src __xnu_pass_object_size __sized_by(n),
481*8d741a5dSApple OSS Distributions size_t n)
482*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(dst, n, "write overflow")
483*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(src, n, "read overflow")
484*8d741a5dSApple OSS Distributions {
485*8d741a5dSApple OSS Distributions return memmove(dst, src, n);
486*8d741a5dSApple OSS Distributions }
487*8d741a5dSApple OSS Distributions
488*8d741a5dSApple OSS Distributions __xnu_string_inline
489*8d741a5dSApple OSS Distributions void *
__sized_by(n)490*8d741a5dSApple OSS Distributions __sized_by(n)
491*8d741a5dSApple OSS Distributions __nochk_memcpy(
492*8d741a5dSApple OSS Distributions void *const dst __xnu_pass_struct_size __sized_by(n),
493*8d741a5dSApple OSS Distributions const void *const src __xnu_pass_struct_size __sized_by(n),
494*8d741a5dSApple OSS Distributions size_t n)
495*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(dst, n, "write overflow")
496*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(src, n, "read overflow")
497*8d741a5dSApple OSS Distributions {
498*8d741a5dSApple OSS Distributions return __nochk_memmove(dst, src, n);
499*8d741a5dSApple OSS Distributions }
500*8d741a5dSApple OSS Distributions
501*8d741a5dSApple OSS Distributions
502*8d741a5dSApple OSS Distributions #pragma mark string functions
503*8d741a5dSApple OSS Distributions
504*8d741a5dSApple OSS Distributions extern size_t strlen(const char *__null_terminated s) __stateful_pure;
505*8d741a5dSApple OSS Distributions
506*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strlen)
507*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
508*8d741a5dSApple OSS Distributions size_t
strlen(const char * const s __xnu_force_overload)509*8d741a5dSApple OSS Distributions strlen(const char * /* __null_terminated */ const s __xnu_force_overload)
510*8d741a5dSApple OSS Distributions {
511*8d741a5dSApple OSS Distributions return __builtin_strlen(s);
512*8d741a5dSApple OSS Distributions }
513*8d741a5dSApple OSS Distributions #endif
514*8d741a5dSApple OSS Distributions
515*8d741a5dSApple OSS Distributions
516*8d741a5dSApple OSS Distributions extern size_t strnlen(const char *__counted_by(n)s, size_t n) __stateful_pure;
517*8d741a5dSApple OSS Distributions
518*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strnlen)
519*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
520*8d741a5dSApple OSS Distributions size_t
strnlen(const char * const __counted_by (n)s __xnu_force_overload,size_t n)521*8d741a5dSApple OSS Distributions strnlen(const char *const __counted_by(n) s __xnu_force_overload, size_t n)
522*8d741a5dSApple OSS Distributions {
523*8d741a5dSApple OSS Distributions return __builtin_strnlen(s, n);
524*8d741a5dSApple OSS Distributions }
525*8d741a5dSApple OSS Distributions #endif
526*8d741a5dSApple OSS Distributions
527*8d741a5dSApple OSS Distributions
528*8d741a5dSApple OSS Distributions /* strbuflen is the same as strnlen. */
529*8d741a5dSApple OSS Distributions #define strbuflen_1(BUF) ({ \
530*8d741a5dSApple OSS Distributions __xnu_assert_is_array(BUF, "argument is not an array"); \
531*8d741a5dSApple OSS Distributions strnlen((BUF), sizeof(BUF)); \
532*8d741a5dSApple OSS Distributions })
533*8d741a5dSApple OSS Distributions #define strbuflen_2(BUF, LEN) strnlen(BUF, LEN)
534*8d741a5dSApple OSS Distributions #define strbuflen(...) __xnu_argc_overload(strbuflen, __VA_ARGS__)
535*8d741a5dSApple OSS Distributions
536*8d741a5dSApple OSS Distributions
537*8d741a5dSApple OSS Distributions extern int strcmp(const char *__null_terminated s1, const char *__null_terminated s2) __stateful_pure;
538*8d741a5dSApple OSS Distributions
539*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strcmp)
540*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
541*8d741a5dSApple OSS Distributions int
strcmp(const char * const s1 __xnu_force_overload,const char * const __null_terminated s2)542*8d741a5dSApple OSS Distributions strcmp(
543*8d741a5dSApple OSS Distributions const char *const /* __null_terminated */ s1 __xnu_force_overload,
544*8d741a5dSApple OSS Distributions const char *const __null_terminated s2)
545*8d741a5dSApple OSS Distributions {
546*8d741a5dSApple OSS Distributions return __builtin_strcmp(s1, s2);
547*8d741a5dSApple OSS Distributions }
548*8d741a5dSApple OSS Distributions #else
549*8d741a5dSApple OSS Distributions #endif
550*8d741a5dSApple OSS Distributions
551*8d741a5dSApple OSS Distributions
552*8d741a5dSApple OSS Distributions __ptrcheck_unavailable_r("strlcmp or strbufcmp")
553*8d741a5dSApple OSS Distributions extern int strncmp(const char *__unsafe_indexable s1, const char *__unsafe_indexable s2, size_t n) __stateful_pure;
554*8d741a5dSApple OSS Distributions
555*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strncmp)
556*8d741a5dSApple OSS Distributions __ptrcheck_unavailable_r("strlcmp or strbufcmp")
557*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
558*8d741a5dSApple OSS Distributions int
strncmp(const char * const __unsafe_indexable s1 __xnu_force_overload,const char * const __unsafe_indexable s2,size_t n)559*8d741a5dSApple OSS Distributions strncmp(
560*8d741a5dSApple OSS Distributions const char *const __unsafe_indexable s1 __xnu_force_overload,
561*8d741a5dSApple OSS Distributions const char *const __unsafe_indexable s2, size_t n)
562*8d741a5dSApple OSS Distributions {
563*8d741a5dSApple OSS Distributions return __builtin_strncmp(s1, s2, n);
564*8d741a5dSApple OSS Distributions }
565*8d741a5dSApple OSS Distributions #endif
566*8d741a5dSApple OSS Distributions
567*8d741a5dSApple OSS Distributions /*
568*8d741a5dSApple OSS Distributions * Use strlcmp if you want to compare one string with a known length (with or
569*8d741a5dSApple OSS Distributions * without a NUL terminator) and one string with an unknown length (that always
570*8d741a5dSApple OSS Distributions * has a NUL terminator).
571*8d741a5dSApple OSS Distributions * See docs/primitives/string-handling.md for more information.
572*8d741a5dSApple OSS Distributions */
573*8d741a5dSApple OSS Distributions extern int strlcmp(const char *__counted_by(n)s1, const char *s2, size_t n) __stateful_pure;
574*8d741a5dSApple OSS Distributions
575*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strncmp)
576*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
577*8d741a5dSApple OSS Distributions int
strlcmp(const char * const __counted_by (s1len)s1 __xnu_force_overload,const char * const s2,size_t s1len)578*8d741a5dSApple OSS Distributions strlcmp(
579*8d741a5dSApple OSS Distributions const char *const __counted_by(s1len) s1 __xnu_force_overload,
580*8d741a5dSApple OSS Distributions const char *const s2, size_t s1len)
581*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(s1, s1len, "read overflow")
582*8d741a5dSApple OSS Distributions {
583*8d741a5dSApple OSS Distributions extern int __xnu_strlcmp(
584*8d741a5dSApple OSS Distributions const char * __counted_by(s1len) s1,
585*8d741a5dSApple OSS Distributions const char *__null_terminated s2,
586*8d741a5dSApple OSS Distributions size_t s1len) __asm("_strlcmp");
587*8d741a5dSApple OSS Distributions
588*8d741a5dSApple OSS Distributions __xnu_member_size_check(s1, s1len, read);
589*8d741a5dSApple OSS Distributions return __xnu_strlcmp(s1, s2, s1len);
590*8d741a5dSApple OSS Distributions }
591*8d741a5dSApple OSS Distributions #endif
592*8d741a5dSApple OSS Distributions
593*8d741a5dSApple OSS Distributions
594*8d741a5dSApple OSS Distributions /*
595*8d741a5dSApple OSS Distributions * Use strbufcmp if you want to compare two strings and you know both of their
596*8d741a5dSApple OSS Distributions * lengths. See docs/primitives/string-handling.md for more information.
597*8d741a5dSApple OSS Distributions */
598*8d741a5dSApple OSS Distributions extern int strbufcmp(const char *__counted_by(s1len)s1, size_t s1len, const char *__counted_by(s2len)s2, size_t s2len) __stateful_pure;
599*8d741a5dSApple OSS Distributions
600*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
601*8d741a5dSApple OSS Distributions int
strbufcmp(const char * const __counted_by (s1len)s1 __xnu_pass_member_size,size_t s1len,const char * const __counted_by (s2len)s2 __xnu_pass_member_size,size_t s2len)602*8d741a5dSApple OSS Distributions strbufcmp(
603*8d741a5dSApple OSS Distributions const char *const __counted_by(s1len) s1 __xnu_pass_member_size, size_t s1len,
604*8d741a5dSApple OSS Distributions const char *const __counted_by(s2len) s2 __xnu_pass_member_size, size_t s2len)
605*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(s1, s1len, "read overflow")
606*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(s2, s2len, "read overflow")
607*8d741a5dSApple OSS Distributions {
608*8d741a5dSApple OSS Distributions extern int __xnu_strbufcmp(
609*8d741a5dSApple OSS Distributions const char * __counted_by(s1len) s1,
610*8d741a5dSApple OSS Distributions size_t s1len,
611*8d741a5dSApple OSS Distributions const char *__counted_by(s2len) s2,
612*8d741a5dSApple OSS Distributions size_t s2len) __asm("_strbufcmp");
613*8d741a5dSApple OSS Distributions
614*8d741a5dSApple OSS Distributions __xnu_member_size_check(s1, s1len, read);
615*8d741a5dSApple OSS Distributions __xnu_member_size_check(s2, s2len, read);
616*8d741a5dSApple OSS Distributions return __xnu_strbufcmp(s1, s1len, s2, s2len);
617*8d741a5dSApple OSS Distributions }
618*8d741a5dSApple OSS Distributions
619*8d741a5dSApple OSS Distributions #define strbufcmp_2(A, B) ({ \
620*8d741a5dSApple OSS Distributions __xnu_assert_is_array(A, "first argument is not an array"); \
621*8d741a5dSApple OSS Distributions __xnu_assert_is_array(B, "second argument is not an array"); \
622*8d741a5dSApple OSS Distributions (strbufcmp)((A), sizeof(A), (B), sizeof(B)); \
623*8d741a5dSApple OSS Distributions })
624*8d741a5dSApple OSS Distributions #define strbufcmp_4 (strbufcmp)
625*8d741a5dSApple OSS Distributions #define strbufcmp(...) __xnu_argc_overload(strbufcmp, __VA_ARGS__)
626*8d741a5dSApple OSS Distributions
627*8d741a5dSApple OSS Distributions
628*8d741a5dSApple OSS Distributions extern int strprefix(const char *__null_terminated s1, const char *__null_terminated s2) __stateful_pure;
629*8d741a5dSApple OSS Distributions
630*8d741a5dSApple OSS Distributions
631*8d741a5dSApple OSS Distributions extern int strcasecmp(const char *__null_terminated s1, const char *__null_terminated s2) __stateful_pure;
632*8d741a5dSApple OSS Distributions
633*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strcasecmp)
634*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
635*8d741a5dSApple OSS Distributions int
strcasecmp(const char * const s1 __xnu_force_overload,const char * const __null_terminated s2)636*8d741a5dSApple OSS Distributions strcasecmp(
637*8d741a5dSApple OSS Distributions const char *const /* __null_terminated */ s1 __xnu_force_overload,
638*8d741a5dSApple OSS Distributions const char *const __null_terminated s2)
639*8d741a5dSApple OSS Distributions {
640*8d741a5dSApple OSS Distributions return __builtin_strcasecmp(s1, s2);
641*8d741a5dSApple OSS Distributions }
642*8d741a5dSApple OSS Distributions #endif
643*8d741a5dSApple OSS Distributions
644*8d741a5dSApple OSS Distributions
645*8d741a5dSApple OSS Distributions __ptrcheck_unavailable_r("strlcasecmp or strbufcasecmp")
646*8d741a5dSApple OSS Distributions extern int strncasecmp(const char *__unsafe_indexable s1, const char *__unsafe_indexable s2, size_t n) __stateful_pure;
647*8d741a5dSApple OSS Distributions
648*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strncasecmp)
649*8d741a5dSApple OSS Distributions __ptrcheck_unavailable_r("strlcasecmp or strbufcasecmp")
650*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
651*8d741a5dSApple OSS Distributions int
strncasecmp(const char * const __unsafe_indexable s1 __xnu_force_overload,const char * const __unsafe_indexable s2,size_t n)652*8d741a5dSApple OSS Distributions strncasecmp(
653*8d741a5dSApple OSS Distributions const char *const __unsafe_indexable s1 __xnu_force_overload,
654*8d741a5dSApple OSS Distributions const char *const __unsafe_indexable s2, size_t n)
655*8d741a5dSApple OSS Distributions {
656*8d741a5dSApple OSS Distributions return __builtin_strncasecmp(s1, s2, n);
657*8d741a5dSApple OSS Distributions }
658*8d741a5dSApple OSS Distributions #endif
659*8d741a5dSApple OSS Distributions
660*8d741a5dSApple OSS Distributions /*
661*8d741a5dSApple OSS Distributions * Use strlcasecmp if you want to compare one string with a known length (with
662*8d741a5dSApple OSS Distributions * or without a NUL terminator) and one string with an unknown length (that
663*8d741a5dSApple OSS Distributions * always has a NUL terminator).
664*8d741a5dSApple OSS Distributions * See docs/primitives/string-handling.md for more information.
665*8d741a5dSApple OSS Distributions */
666*8d741a5dSApple OSS Distributions extern int strlcasecmp(const char *__counted_by(n)s1, const char *s2, size_t n) __stateful_pure;
667*8d741a5dSApple OSS Distributions
668*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
669*8d741a5dSApple OSS Distributions int
strlcasecmp(const char * const __counted_by (s1len)s1 __xnu_force_overload,const char * __null_terminated const s2,size_t s1len)670*8d741a5dSApple OSS Distributions strlcasecmp(
671*8d741a5dSApple OSS Distributions const char *const __counted_by(s1len) s1 __xnu_force_overload,
672*8d741a5dSApple OSS Distributions const char *__null_terminated const s2, size_t s1len)
673*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(s1, s1len, "read overflow")
674*8d741a5dSApple OSS Distributions {
675*8d741a5dSApple OSS Distributions extern int __xnu_strlcasecmp(
676*8d741a5dSApple OSS Distributions const char * __counted_by(s1len) s1,
677*8d741a5dSApple OSS Distributions const char *__null_terminated s2,
678*8d741a5dSApple OSS Distributions size_t s1len) __asm("_strlcasecmp");
679*8d741a5dSApple OSS Distributions
680*8d741a5dSApple OSS Distributions __xnu_member_size_check(s1, s1len, read);
681*8d741a5dSApple OSS Distributions return __xnu_strlcasecmp(s1, s2, s1len);
682*8d741a5dSApple OSS Distributions }
683*8d741a5dSApple OSS Distributions
684*8d741a5dSApple OSS Distributions
685*8d741a5dSApple OSS Distributions /*
686*8d741a5dSApple OSS Distributions * Use strbufcmp if you want to compare two strings and you know both of their
687*8d741a5dSApple OSS Distributions * lengths. See docs/primitives/string-handling.md for more information.
688*8d741a5dSApple OSS Distributions */
689*8d741a5dSApple OSS Distributions extern int strbufcasecmp(const char *__counted_by(s1len)s1, size_t s1len, const char *__counted_by(s2len)s2, size_t s2len) __stateful_pure;
690*8d741a5dSApple OSS Distributions
691*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
692*8d741a5dSApple OSS Distributions int
strbufcasecmp(const char * const __counted_by (s1len)s1 __xnu_pass_member_size,size_t s1len,const char * const __counted_by (s2len)s2 __xnu_pass_member_size,size_t s2len)693*8d741a5dSApple OSS Distributions strbufcasecmp(
694*8d741a5dSApple OSS Distributions const char *const __counted_by(s1len) s1 __xnu_pass_member_size, size_t s1len,
695*8d741a5dSApple OSS Distributions const char *const __counted_by(s2len) s2 __xnu_pass_member_size, size_t s2len)
696*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(s1, s1len, "read overflow")
697*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(s2, s2len, "read overflow")
698*8d741a5dSApple OSS Distributions {
699*8d741a5dSApple OSS Distributions extern int __xnu_strbufcasecmp(
700*8d741a5dSApple OSS Distributions const char * __counted_by(s1len) s1,
701*8d741a5dSApple OSS Distributions size_t s1len,
702*8d741a5dSApple OSS Distributions const char *__counted_by(s2len) s2,
703*8d741a5dSApple OSS Distributions size_t s2len) __asm("_strbufcasecmp");
704*8d741a5dSApple OSS Distributions
705*8d741a5dSApple OSS Distributions __xnu_member_size_check(s1, s1len, read);
706*8d741a5dSApple OSS Distributions __xnu_member_size_check(s2, s2len, read);
707*8d741a5dSApple OSS Distributions return __xnu_strbufcasecmp(s1, s1len, s2, s2len);
708*8d741a5dSApple OSS Distributions }
709*8d741a5dSApple OSS Distributions
710*8d741a5dSApple OSS Distributions #define strbufcasecmp_2(A, B) ({ \
711*8d741a5dSApple OSS Distributions __xnu_assert_is_array(A, "first argument is not an array"); \
712*8d741a5dSApple OSS Distributions __xnu_assert_is_array(B, "second argument is not an array"); \
713*8d741a5dSApple OSS Distributions (strbufcasecmp)((A), sizeof(A), (B), sizeof(B)); \
714*8d741a5dSApple OSS Distributions })
715*8d741a5dSApple OSS Distributions #define strbufcasecmp_4 (strbufcasecmp)
716*8d741a5dSApple OSS Distributions #define strbufcasecmp(...) __xnu_argc_overload(strbufcasecmp, __VA_ARGS__)
717*8d741a5dSApple OSS Distributions
718*8d741a5dSApple OSS Distributions
719*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strchr)
720*8d741a5dSApple OSS Distributions __xnu_string_inline
721*8d741a5dSApple OSS Distributions char *__null_terminated
strchr(const char * const s __xnu_force_overload,int c)722*8d741a5dSApple OSS Distributions strchr(const char *const /* __null_terminated */ s __xnu_force_overload, int c)
723*8d741a5dSApple OSS Distributions {
724*8d741a5dSApple OSS Distributions return __unsafe_forge_null_terminated(char *, __builtin_strchr(s, c));
725*8d741a5dSApple OSS Distributions }
726*8d741a5dSApple OSS Distributions #endif
727*8d741a5dSApple OSS Distributions
728*8d741a5dSApple OSS Distributions
729*8d741a5dSApple OSS Distributions #if XNU_KERNEL_PRIVATE /* rdar://103276672 */
730*8d741a5dSApple OSS Distributions extern char *__null_terminated strrchr(const char *__null_terminated s, int c) __stateful_pure;
731*8d741a5dSApple OSS Distributions
732*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strrchr) && !__has_ptrcheck /* rdar://103265304 */
733*8d741a5dSApple OSS Distributions __xnu_string_inline
734*8d741a5dSApple OSS Distributions char *__null_terminated
strrchr(const char * const __null_terminated s __xnu_force_overload,int c)735*8d741a5dSApple OSS Distributions strrchr(const char *const __null_terminated s __xnu_force_overload, int c)
736*8d741a5dSApple OSS Distributions {
737*8d741a5dSApple OSS Distributions return __builtin_strrchr(s, c);
738*8d741a5dSApple OSS Distributions }
739*8d741a5dSApple OSS Distributions #endif
740*8d741a5dSApple OSS Distributions #endif
741*8d741a5dSApple OSS Distributions
742*8d741a5dSApple OSS Distributions
743*8d741a5dSApple OSS Distributions extern char *__null_terminated strnstr(const char *__null_terminated s, const char *__null_terminated find, size_t slen) __stateful_pure;
744*8d741a5dSApple OSS Distributions
745*8d741a5dSApple OSS Distributions
746*8d741a5dSApple OSS Distributions extern size_t strlcpy(char *__counted_by(n) dst, const char *__null_terminated src, size_t n);
747*8d741a5dSApple OSS Distributions
748*8d741a5dSApple OSS Distributions __xnu_string_inline
749*8d741a5dSApple OSS Distributions size_t
strlcpy(char * const dst __xnu_pass_member_size __counted_by (n),const char * const src __null_terminated,size_t n)750*8d741a5dSApple OSS Distributions strlcpy(
751*8d741a5dSApple OSS Distributions char *const dst __xnu_pass_member_size __counted_by(n),
752*8d741a5dSApple OSS Distributions const char *const src __null_terminated,
753*8d741a5dSApple OSS Distributions size_t n)
754*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(dst, n, "write overflow")
755*8d741a5dSApple OSS Distributions {
756*8d741a5dSApple OSS Distributions extern size_t __xnu_strlcpy(
757*8d741a5dSApple OSS Distributions char * __counted_by(n),
758*8d741a5dSApple OSS Distributions const char *__null_terminated,
759*8d741a5dSApple OSS Distributions size_t n) __asm("_strlcpy");
760*8d741a5dSApple OSS Distributions
761*8d741a5dSApple OSS Distributions __xnu_member_size_check(dst, n, write);
762*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strlcpy)
763*8d741a5dSApple OSS Distributions return __builtin_strlcpy(dst, src, n);
764*8d741a5dSApple OSS Distributions #else
765*8d741a5dSApple OSS Distributions return __xnu_strlcpy(dst, src, n);
766*8d741a5dSApple OSS Distributions #endif
767*8d741a5dSApple OSS Distributions }
768*8d741a5dSApple OSS Distributions
769*8d741a5dSApple OSS Distributions
770*8d741a5dSApple OSS Distributions /*
771*8d741a5dSApple OSS Distributions * strbufcpy returns its destination as a NUL-terminated string, which makes a
772*8d741a5dSApple OSS Distributions * difference when -fbounds-safety is enabled.
773*8d741a5dSApple OSS Distributions * See docs/primitives/string-handling.md for more information.
774*8d741a5dSApple OSS Distributions */
775*8d741a5dSApple OSS Distributions extern const char *__null_terminated
776*8d741a5dSApple OSS Distributions strbufcpy(
777*8d741a5dSApple OSS Distributions char *__counted_by(dstsz) dst,
778*8d741a5dSApple OSS Distributions size_t dstsz,
779*8d741a5dSApple OSS Distributions const char *__counted_by(srcsz) src,
780*8d741a5dSApple OSS Distributions size_t srcsz);
781*8d741a5dSApple OSS Distributions
782*8d741a5dSApple OSS Distributions __xnu_string_inline
783*8d741a5dSApple OSS Distributions const char *
strbufcpy(char * const dst __xnu_pass_member_size __counted_by (dstsz),size_t dstsz,const char * const src __xnu_pass_member_size __counted_by (srcsz),size_t srcsz)784*8d741a5dSApple OSS Distributions strbufcpy(
785*8d741a5dSApple OSS Distributions char *const dst __xnu_pass_member_size __counted_by(dstsz),
786*8d741a5dSApple OSS Distributions size_t dstsz,
787*8d741a5dSApple OSS Distributions const char *const src __xnu_pass_member_size __counted_by(srcsz),
788*8d741a5dSApple OSS Distributions size_t srcsz)
789*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(dst, dstsz, "write overflow")
790*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(src, srcsz, "read overflow")
791*8d741a5dSApple OSS Distributions {
792*8d741a5dSApple OSS Distributions extern const char *__xnu_strbufcpy(
793*8d741a5dSApple OSS Distributions char *__counted_by(dstsz) dst,
794*8d741a5dSApple OSS Distributions size_t dstsz,
795*8d741a5dSApple OSS Distributions const char *__counted_by(srcsz) src,
796*8d741a5dSApple OSS Distributions size_t srcsz) __asm("_strbufcpy");
797*8d741a5dSApple OSS Distributions
798*8d741a5dSApple OSS Distributions __xnu_member_size_check(dst, dstsz, write);
799*8d741a5dSApple OSS Distributions __xnu_member_size_check(src, srcsz, read);
800*8d741a5dSApple OSS Distributions return __xnu_strbufcpy(dst, dstsz, src, srcsz);
801*8d741a5dSApple OSS Distributions }
802*8d741a5dSApple OSS Distributions
803*8d741a5dSApple OSS Distributions #define strbufcpy_2(DST, SRC) ({ \
804*8d741a5dSApple OSS Distributions __xnu_assert_is_array(DST, "dst is not an array"); \
805*8d741a5dSApple OSS Distributions __xnu_assert_is_array(SRC, "src is not an array"); \
806*8d741a5dSApple OSS Distributions (strbufcpy)((DST), sizeof(DST), (SRC), sizeof(SRC)); \
807*8d741a5dSApple OSS Distributions })
808*8d741a5dSApple OSS Distributions #define strbufcpy_4 (strbufcpy)
809*8d741a5dSApple OSS Distributions #define strbufcpy(...) __xnu_argc_overload(strbufcpy, __VA_ARGS__)
810*8d741a5dSApple OSS Distributions
811*8d741a5dSApple OSS Distributions extern size_t strlcat(char *__counted_by(n) dst, const char *__null_terminated src, size_t n);
812*8d741a5dSApple OSS Distributions
813*8d741a5dSApple OSS Distributions __xnu_string_inline
814*8d741a5dSApple OSS Distributions size_t
strlcat(char * const dst __xnu_pass_member_size __counted_by (n),const char * const src __null_terminated,size_t n)815*8d741a5dSApple OSS Distributions strlcat(
816*8d741a5dSApple OSS Distributions char *const dst __xnu_pass_member_size __counted_by(n),
817*8d741a5dSApple OSS Distributions const char *const src __null_terminated,
818*8d741a5dSApple OSS Distributions size_t n)
819*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(dst, n, "write overflow")
820*8d741a5dSApple OSS Distributions {
821*8d741a5dSApple OSS Distributions extern size_t __xnu_strlcat(
822*8d741a5dSApple OSS Distributions char * __sized_by(n),
823*8d741a5dSApple OSS Distributions const char *__null_terminated,
824*8d741a5dSApple OSS Distributions size_t n) __asm("_strlcat");
825*8d741a5dSApple OSS Distributions
826*8d741a5dSApple OSS Distributions __xnu_member_size_check(dst, n, write);
827*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strlcat)
828*8d741a5dSApple OSS Distributions return __builtin_strlcat(dst, src, n);
829*8d741a5dSApple OSS Distributions #else
830*8d741a5dSApple OSS Distributions return __xnu_strlcat(dst, src, n);
831*8d741a5dSApple OSS Distributions #endif
832*8d741a5dSApple OSS Distributions }
833*8d741a5dSApple OSS Distributions
834*8d741a5dSApple OSS Distributions
835*8d741a5dSApple OSS Distributions /*
836*8d741a5dSApple OSS Distributions * strbufcat returns its destination as a NUL-terminated string, which makes a
837*8d741a5dSApple OSS Distributions * difference when -fbounds-safety is enabled.
838*8d741a5dSApple OSS Distributions * See docs/primitives/string-handling.md for more information.
839*8d741a5dSApple OSS Distributions */
840*8d741a5dSApple OSS Distributions extern const char *__null_terminated
841*8d741a5dSApple OSS Distributions strbufcat(
842*8d741a5dSApple OSS Distributions char *__counted_by(dstsz) dst,
843*8d741a5dSApple OSS Distributions size_t dstsz,
844*8d741a5dSApple OSS Distributions const char *__counted_by(srcsz) src,
845*8d741a5dSApple OSS Distributions size_t srcsz);
846*8d741a5dSApple OSS Distributions
847*8d741a5dSApple OSS Distributions __xnu_string_inline
848*8d741a5dSApple OSS Distributions const char *
strbufcat(char * const dst __xnu_pass_member_size __counted_by (dstsz),size_t dstsz,const char * const src __xnu_pass_member_size __counted_by (srcsz),size_t srcsz)849*8d741a5dSApple OSS Distributions strbufcat(
850*8d741a5dSApple OSS Distributions char *const dst __xnu_pass_member_size __counted_by(dstsz),
851*8d741a5dSApple OSS Distributions size_t dstsz,
852*8d741a5dSApple OSS Distributions const char *const src __xnu_pass_member_size __counted_by(srcsz),
853*8d741a5dSApple OSS Distributions size_t srcsz)
854*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(dst, dstsz, "write overflow")
855*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(src, srcsz, "read overflow")
856*8d741a5dSApple OSS Distributions {
857*8d741a5dSApple OSS Distributions extern const char *__xnu_strbufcat(
858*8d741a5dSApple OSS Distributions char *__counted_by(dstsz) dst,
859*8d741a5dSApple OSS Distributions size_t dstsz,
860*8d741a5dSApple OSS Distributions const char *__counted_by(srcsz) src,
861*8d741a5dSApple OSS Distributions size_t srcsz) __asm("_strbufcat");
862*8d741a5dSApple OSS Distributions
863*8d741a5dSApple OSS Distributions __xnu_member_size_check(dst, dstsz, write);
864*8d741a5dSApple OSS Distributions __xnu_member_size_check(src, srcsz, read);
865*8d741a5dSApple OSS Distributions return __xnu_strbufcat(dst, dstsz, src, srcsz);
866*8d741a5dSApple OSS Distributions }
867*8d741a5dSApple OSS Distributions
868*8d741a5dSApple OSS Distributions #define strbufcat_2(DST, SRC) ({ \
869*8d741a5dSApple OSS Distributions __xnu_assert_is_array(DST, "dst is not an array"); \
870*8d741a5dSApple OSS Distributions __xnu_assert_is_array(SRC, "src is not an array"); \
871*8d741a5dSApple OSS Distributions (strbufcat)((DST), sizeof(DST), (SRC), sizeof(SRC)); \
872*8d741a5dSApple OSS Distributions })
873*8d741a5dSApple OSS Distributions #define strbufcat_4 (strbufcat)
874*8d741a5dSApple OSS Distributions #define strbufcat(...) __xnu_argc_overload(strbufcat, __VA_ARGS__)
875*8d741a5dSApple OSS Distributions
876*8d741a5dSApple OSS Distributions #pragma mark deprecated functions
877*8d741a5dSApple OSS Distributions #if !__has_ptrcheck && !__has_include(<__xnu_libcxx_sentinel.h>)
878*8d741a5dSApple OSS Distributions
879*8d741a5dSApple OSS Distributions /*
880*8d741a5dSApple OSS Distributions * char *strncat(char *dst, const char *src, size_t n);
881*8d741a5dSApple OSS Distributions * char *strncpy(char *dst, const char *src, size_t n);
882*8d741a5dSApple OSS Distributions *
883*8d741a5dSApple OSS Distributions * char *strcat(char *dst, const char *src);
884*8d741a5dSApple OSS Distributions * char *strcpy(char *, const char *);
885*8d741a5dSApple OSS Distributions *
886*8d741a5dSApple OSS Distributions * char *STRDUP(const char *, int);
887*8d741a5dSApple OSS Distributions */
888*8d741a5dSApple OSS Distributions
889*8d741a5dSApple OSS Distributions __deprecated_msg("use strlcat")
890*8d741a5dSApple OSS Distributions __kpi_deprecated_arm64_macos_unavailable
891*8d741a5dSApple OSS Distributions extern char *strncat(char *dst, const char *src, size_t n);
892*8d741a5dSApple OSS Distributions #if __XNU_FORTIFY_SOURCE && __has_builtin(__builtin___strncat_chk)
893*8d741a5dSApple OSS Distributions #define strncat(dst, src, n) __builtin___strncat_chk(dst, src, n, __xnu_member_size(dst))
894*8d741a5dSApple OSS Distributions #endif
895*8d741a5dSApple OSS Distributions
896*8d741a5dSApple OSS Distributions
897*8d741a5dSApple OSS Distributions __deprecated_msg("use strlcpy")
898*8d741a5dSApple OSS Distributions __kpi_deprecated_arm64_macos_unavailable
899*8d741a5dSApple OSS Distributions extern char *strncpy(char *dst, const char *src, size_t n);
900*8d741a5dSApple OSS Distributions #if __XNU_FORTIFY_SOURCE && __has_builtin(__builtin___strncpy_chk)
901*8d741a5dSApple OSS Distributions #define strncpy(dst, src, n) __builtin___strncpy_chk(dst, src, n, __xnu_member_size(dst))
902*8d741a5dSApple OSS Distributions #endif
903*8d741a5dSApple OSS Distributions
904*8d741a5dSApple OSS Distributions __deprecated_msg("use strlcpy")
905*8d741a5dSApple OSS Distributions __kpi_deprecated_arm64_macos_unavailable
906*8d741a5dSApple OSS Distributions extern char *strcpy(char *, const char *);
907*8d741a5dSApple OSS Distributions #if __XNU_FORTIFY_SOURCE && __has_builtin(__builtin___strcpy_chk)
908*8d741a5dSApple OSS Distributions /* rdar://103287225 */
909*8d741a5dSApple OSS Distributions #define strcpy(dst, src, len) __builtin___strcpy_chk(dst, src, __xnu_member_size(dst))
910*8d741a5dSApple OSS Distributions #endif
911*8d741a5dSApple OSS Distributions
912*8d741a5dSApple OSS Distributions __deprecated_msg("use strlcat")
913*8d741a5dSApple OSS Distributions __kpi_deprecated_arm64_macos_unavailable
914*8d741a5dSApple OSS Distributions extern char *strcat(char *dst, const char *src);
915*8d741a5dSApple OSS Distributions #if __XNU_FORTIFY_SOURCE && __has_builtin(__builtin___strcat_chk)
916*8d741a5dSApple OSS Distributions #define strcat(dst, src) __builtin___strcat_chk(dst, src, __xnu_member_size(dst))
917*8d741a5dSApple OSS Distributions #endif
918*8d741a5dSApple OSS Distributions
919*8d741a5dSApple OSS Distributions #if XNU_PLATFORM_MacOSX
920*8d741a5dSApple OSS Distributions #ifndef KERNEL_PRIVATE
921*8d741a5dSApple OSS Distributions extern char *STRDUP(const char *, int);
922*8d741a5dSApple OSS Distributions #endif
923*8d741a5dSApple OSS Distributions #endif /* XNU_PLATFORM_MacOSX */
924*8d741a5dSApple OSS Distributions
925*8d741a5dSApple OSS Distributions #endif /* !__has_ptrcheck && !__has_include(<__xnu_libcxx_sentinel.h>) */
926*8d741a5dSApple OSS Distributions
927*8d741a5dSApple OSS Distributions #if __has_include(<san/memintrinsics.h>)
928*8d741a5dSApple OSS Distributions #include <san/memintrinsics.h>
929*8d741a5dSApple OSS Distributions #endif
930*8d741a5dSApple OSS Distributions
931*8d741a5dSApple OSS Distributions __END_DECLS
932*8d741a5dSApple OSS Distributions
933*8d741a5dSApple OSS Distributions #endif /* _STRING_H_ */
934*8d741a5dSApple OSS Distributions
935*8d741a5dSApple OSS Distributions #endif
936