string.h
1 /* 2 * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28 /* 29 * NOTICE: This file was modified by McAfee Research in 2004 to introduce 30 * support for mandatory and extensible security protections. This notice 31 * is included in support of clause 2.2 (b) of the Apple Public License, 32 * Version 2.0. 33 */ 34 /* 35 * HISTORY 36 * @OSF_COPYRIGHT@ 37 */ 38 #ifndef _STRING_H_ 39 #define _STRING_H_ 1 40 41 #ifdef MACH_KERNEL_PRIVATE 42 #include <types.h> 43 #else 44 #include <sys/types.h> 45 #endif 46 47 #if defined(KERNEL) 48 #include <sys/cdefs.h> 49 #endif 50 51 #ifdef __cplusplus 52 extern "C" { 53 #endif 54 55 #ifndef NULL 56 #if defined (__cplusplus) 57 #if __cplusplus >= 201103L 58 #define NULL nullptr 59 #else 60 #define NULL 0 61 #endif 62 #else 63 #define NULL ((void *)0) 64 #endif 65 #endif 66 67 extern void *memcpy(void *, const void *, size_t); 68 extern int memcmp(const void *, const void *, size_t); 69 extern void *memmove(void *, const void *, size_t); 70 extern void *memset(void *, int, size_t); 71 extern int memset_s(void *, size_t, int, size_t); 72 73 #ifdef XNU_KERNEL_PRIVATE 74 /* memcmp_zero_ptr_aligned() checks string s of n bytes contains all zeros. 75 * Address and size of the string s must be pointer-aligned. 76 * Return 0 if true, 1 otherwise. Also return 0 if n is 0. 77 */ 78 extern unsigned long memcmp_zero_ptr_aligned(const void *s, size_t n); 79 #endif 80 81 extern size_t strlen(const char *); 82 extern size_t strnlen(const char *, size_t); 83 84 /* strcpy() and strncpy() are deprecated. Please use strlcpy() instead. */ 85 __kpi_deprecated_arm64_macos_unavailable 86 extern char *strcpy(char *, const char *) __deprecated; 87 88 __kpi_deprecated_arm64_macos_unavailable 89 extern char *strncpy(char *, const char *, size_t); 90 91 /* strcat() and strncat() are deprecated. Please use strlcat() instead. */ 92 __kpi_deprecated_arm64_macos_unavailable 93 extern char *strcat(char *, const char *) __deprecated; 94 95 __kpi_deprecated_arm64_macos_unavailable 96 extern char *strncat(char *, const char *, size_t); 97 98 extern int strcmp(const char *, const char *); 99 extern int strncmp(const char *, const char *, size_t); 100 101 extern size_t strlcpy(char *, const char *, size_t); 102 extern size_t strlcat(char *, const char *, size_t); 103 104 extern int strcasecmp(const char *s1, const char *s2); 105 extern int strncasecmp(const char *s1, const char *s2, size_t n); 106 #ifdef XNU_KERNEL_PRIVATE 107 extern const char *strnstr(const char *s, const char *find, size_t slen); 108 #else 109 extern char *strnstr(const char *s, const char *find, size_t slen); 110 #endif 111 extern char *strchr(const char *s, int c); 112 #ifdef XNU_KERNEL_PRIVATE 113 extern char *strrchr(const char *s, int c); 114 #endif 115 extern char *STRDUP(const char *, int); 116 extern int strprefix(const char *s1, const char *s2); 117 118 extern int bcmp(const void *, const void *, size_t); 119 extern void bcopy(const void *, void *, size_t); 120 extern void bzero(void *, size_t); 121 extern int timingsafe_bcmp(const void *b1, const void *b2, size_t n); 122 123 #ifdef PRIVATE 124 #include <san/memintrinsics.h> 125 #endif 126 127 #if __has_builtin(__builtin_dynamic_object_size) 128 #define XNU_BOS __builtin_dynamic_object_size 129 #else 130 #define XNU_BOS __builtin_object_size 131 #endif 132 133 134 /* __nochk_ functions for opting out of type 1 bounds checking */ 135 __attribute__((always_inline)) static inline void * 136 __nochk_memcpy(void *dest, const void *src, size_t len) 137 { 138 return __builtin___memcpy_chk(dest, src, len, XNU_BOS(dest, 0)); 139 } 140 __attribute__((always_inline)) static inline void * 141 __nochk_memmove(void *dest, const void *src, size_t len) 142 { 143 return __builtin___memmove_chk(dest, src, len, XNU_BOS(dest, 0)); 144 } 145 __attribute__((always_inline)) static inline void 146 __nochk_bcopy(const void *src, void *dest, size_t len) 147 { 148 __builtin___memmove_chk(dest, src, len, XNU_BOS(dest, 0)); 149 } 150 151 #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_13 152 /* older deployment target */ 153 #elif defined(KASAN) || (defined (_FORTIFY_SOURCE) && _FORTIFY_SOURCE == 0) 154 /* _FORTIFY_SOURCE disabled */ 155 #else /* _chk macros */ 156 157 #if defined XNU_KERNEL_PRIVATE || defined(_FORTIFY_SOURCE_STRICT) 158 /* Stricter checking is optional for kexts. When type is set to 1, __builtin_object_size 159 * returns the size of the closest surrounding sub-object, which would detect copying past 160 * the end of a struct member. */ 161 #define BOS_COPY_TYPE 1 162 #else 163 #define BOS_COPY_TYPE 0 164 #endif 165 166 #if __has_builtin(__builtin___memcpy_chk) 167 #define memcpy(dest, src, len) __builtin___memcpy_chk(dest, src, len, XNU_BOS(dest, BOS_COPY_TYPE)) 168 #endif 169 170 #if __has_builtin(__builtin___memmove_chk) 171 #define memmove(dest, src, len) __builtin___memmove_chk(dest, src, len, XNU_BOS(dest, BOS_COPY_TYPE)) 172 #endif 173 174 #if __has_builtin(__builtin___strncpy_chk) 175 #define strncpy(dest, src, len) __builtin___strncpy_chk(dest, src, len, XNU_BOS(dest, 1)) 176 #endif 177 178 #if __has_builtin(__builtin___strncat_chk) 179 #define strncat(dest, src, len) __builtin___strncat_chk(dest, src, len, XNU_BOS(dest, 1)) 180 #endif 181 182 #if __has_builtin(__builtin___strlcat_chk) 183 #define strlcat(dest, src, len) __builtin___strlcat_chk(dest, src, len, XNU_BOS(dest, 1)) 184 #endif 185 186 #if __has_builtin(__builtin___strlcpy_chk) 187 #define strlcpy(dest, src, len) __builtin___strlcpy_chk(dest, src, len, XNU_BOS(dest, 1)) 188 #endif 189 190 #if __has_builtin(__builtin___strcpy_chk) 191 #define strcpy(dest, src, len) __builtin___strcpy_chk(dest, src, XNU_BOS(dest, 1)) 192 #endif 193 194 #if __has_builtin(__builtin___strcat_chk) 195 #define strcat(dest, src) __builtin___strcat_chk(dest, src, XNU_BOS(dest, 1)) 196 #endif 197 198 #if __has_builtin(__builtin___memmove_chk) 199 #define bcopy(src, dest, len) __builtin___memmove_chk(dest, src, len, XNU_BOS(dest, BOS_COPY_TYPE)) 200 #endif 201 202 #endif /* _chk macros */ 203 #ifdef __cplusplus 204 } 205 #endif 206 207 #endif /* _STRING_H_ */