]> git.saurik.com Git - apple/libc.git/blame - include/secure/_string.h
Libc-825.24.tar.gz
[apple/libc.git] / include / secure / _string.h
CommitLineData
224c7076
A
1/*
2 * Copyright (c) 2007 Apple Inc. All rights reserved.
3 *
4 * @APPLE_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. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24#ifndef _STRING_H_
25# error "Never use <secure/_string.h> directly; include <string.h> instead."
26#endif
27
28#ifndef _SECURE__STRING_H_
29#define _SECURE__STRING_H_
30
34e8f829 31#include <sys/cdefs.h>
224c7076
A
32#include <secure/_common.h>
33
34#if _USE_FORTIFY_LEVEL > 0
35
1f2f436a
A
36/* memcpy, mempcpy, memmove, memset, strcpy, stpcpy, strncpy, stpncpy,
37 strcat, and strncat */
224c7076
A
38
39#undef memcpy
40#undef memmove
41#undef memset
42#undef strcpy
1f2f436a 43#if __DARWIN_C_LEVEL >= 200809L
224c7076 44#undef stpcpy
1f2f436a
A
45#undef stpncpy
46#endif
224c7076
A
47#undef strncpy
48#undef strcat
1f2f436a 49#if ! (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 32000)
224c7076 50#undef strncat
1f2f436a 51#endif
224c7076
A
52
53#define memcpy(dest, src, len) \
54 ((__darwin_obsz0 (dest) != (size_t) -1) \
55 ? __builtin___memcpy_chk (dest, src, len, __darwin_obsz0 (dest)) \
56 : __inline_memcpy_chk (dest, src, len))
57
34e8f829 58static __inline void *
224c7076
A
59__inline_memcpy_chk (void *__dest, const void *__src, size_t __len)
60{
61 return __builtin___memcpy_chk (__dest, __src, __len, __darwin_obsz0(__dest));
62}
63
64#define memmove(dest, src, len) \
65 ((__darwin_obsz0 (dest) != (size_t) -1) \
66 ? __builtin___memmove_chk (dest, src, len, __darwin_obsz0 (dest)) \
67 : __inline_memmove_chk (dest, src, len))
68
34e8f829 69static __inline void *
224c7076
A
70__inline_memmove_chk (void *__dest, const void *__src, size_t __len)
71{
72 return __builtin___memmove_chk (__dest, __src, __len, __darwin_obsz0(__dest));
73}
74
75#define memset(dest, val, len) \
76 ((__darwin_obsz0 (dest) != (size_t) -1) \
77 ? __builtin___memset_chk (dest, val, len, __darwin_obsz0 (dest)) \
78 : __inline_memset_chk (dest, val, len))
79
34e8f829 80static __inline void *
224c7076
A
81__inline_memset_chk (void *__dest, int __val, size_t __len)
82{
83 return __builtin___memset_chk (__dest, __val, __len, __darwin_obsz0(__dest));
84}
85
86#define strcpy(dest, src) \
87 ((__darwin_obsz0 (dest) != (size_t) -1) \
88 ? __builtin___strcpy_chk (dest, src, __darwin_obsz (dest)) \
89 : __inline_strcpy_chk (dest, src))
90
34e8f829 91static __inline char *
224c7076
A
92__inline_strcpy_chk (char *__restrict __dest, const char *__restrict __src)
93{
94 return __builtin___strcpy_chk (__dest, __src, __darwin_obsz(__dest));
95}
96
1f2f436a 97#if __DARWIN_C_LEVEL >= 200809L
224c7076
A
98#define stpcpy(dest, src) \
99 ((__darwin_obsz0 (dest) != (size_t) -1) \
100 ? __builtin___stpcpy_chk (dest, src, __darwin_obsz (dest)) \
101 : __inline_stpcpy_chk (dest, src))
102
34e8f829 103static __inline char *
224c7076
A
104__inline_stpcpy_chk (char *__dest, const char *__src)
105{
106 return __builtin___stpcpy_chk (__dest, __src, __darwin_obsz(__dest));
107}
1f2f436a
A
108
109#define stpncpy(dest, src, len) \
110 ((__darwin_obsz0 (dest) != (size_t) -1) \
111 ? __builtin___stpncpy_chk (dest, src, len, __darwin_obsz (dest)) \
112 : __inline_stpncpy_chk (dest, src, len))
113
114static __inline char *
115__inline_stpncpy_chk (char *__restrict __dest, const char *__restrict __src,
116 size_t __len)
117{
118 return __builtin___stpncpy_chk (__dest, __src, __len, __darwin_obsz(__dest));
119}
120#endif
224c7076
A
121
122#define strncpy(dest, src, len) \
123 ((__darwin_obsz0 (dest) != (size_t) -1) \
124 ? __builtin___strncpy_chk (dest, src, len, __darwin_obsz (dest)) \
125 : __inline_strncpy_chk (dest, src, len))
126
34e8f829 127static __inline char *
224c7076
A
128__inline_strncpy_chk (char *__restrict __dest, const char *__restrict __src,
129 size_t __len)
130{
131 return __builtin___strncpy_chk (__dest, __src, __len, __darwin_obsz(__dest));
132}
133
134#define strcat(dest, src) \
135 ((__darwin_obsz0 (dest) != (size_t) -1) \
136 ? __builtin___strcat_chk (dest, src, __darwin_obsz (dest)) \
137 : __inline_strcat_chk (dest, src))
138
34e8f829 139static __inline char *
224c7076
A
140__inline_strcat_chk (char *__restrict __dest, const char *__restrict __src)
141{
142 return __builtin___strcat_chk (__dest, __src, __darwin_obsz(__dest));
143}
144
1f2f436a 145#if ! (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 32000)
224c7076
A
146#define strncat(dest, src, len) \
147 ((__darwin_obsz0 (dest) != (size_t) -1) \
34e8f829 148 ? __builtin___strncat_chk (dest, src, len, __darwin_obsz (dest)) \
224c7076
A
149 : __inline_strncat_chk (dest, src, len))
150
34e8f829 151static __inline char *
224c7076
A
152__inline_strncat_chk (char *__restrict __dest, const char *__restrict __src,
153 size_t __len)
154{
155 return __builtin___strncat_chk (__dest, __src, __len, __darwin_obsz(__dest));
156}
1f2f436a 157#endif
224c7076
A
158
159#endif
160#endif