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