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