summaryrefslogtreecommitdiff
path: root/include/string.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/string.h')
-rw-r--r--include/string.h151
1 files changed, 72 insertions, 79 deletions
diff --git a/include/string.h b/include/string.h
index 65df3a1..02e931e 100644
--- a/include/string.h
+++ b/include/string.h
@@ -6,10 +6,20 @@
6#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0 6#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0
7 7
8#ifndef __cplusplus 8#ifndef __cplusplus
9#undef memcpy
10#undef memmove
11#undef memset
12#undef stpcpy
13#undef stpncpy
14#undef strcat
15#undef strcpy
16#undef strncat
17#undef strncpy
9 18
10static inline __attribute__ ((always_inline)) 19extern void *__memcpy_orig(void *, const void *, size_t)
11void * 20 __asm__(__USER_LABEL_PREFIX__ "memcpy");
12__fortify_memcpy(void *dest, const void *src, size_t n) 21extern __inline __attribute__((__always_inline__,__gnu_inline__))
22void *memcpy(void *dest, const void *src, size_t n)
13{ 23{
14 size_t bos = __builtin_object_size(dest, 0); 24 size_t bos = __builtin_object_size(dest, 0);
15 char *d = dest; 25 char *d = dest;
@@ -22,78 +32,85 @@ __fortify_memcpy(void *dest, const void *src, size_t n)
22 __builtin_trap(); 32 __builtin_trap();
23 if (n > bos) 33 if (n > bos)
24 __builtin_trap(); 34 __builtin_trap();
25 return memcpy(dest, src, n); 35 return __memcpy_orig(dest, src, n);
26} 36}
27 37
28static inline __attribute__ ((always_inline)) 38extern void *__memmove_orig(void *, const void *, size_t)
29void * 39 __asm__(__USER_LABEL_PREFIX__ "memmove");
30__fortify_memmove(void *dest, const void *src, size_t n) 40extern __inline __attribute__((__always_inline__,__gnu_inline__))
41void *memmove(void *dest, const void *src, size_t n)
31{ 42{
32 size_t bos = __builtin_object_size(dest, 0); 43 size_t bos = __builtin_object_size(dest, 0);
33 44
34 if (n > bos) 45 if (n > bos)
35 __builtin_trap(); 46 __builtin_trap();
36 return memmove(dest, src, n); 47 return __memmove_orig(dest, src, n);
37} 48}
38 49
39static inline __attribute__ ((always_inline)) 50extern void *__memset_orig(void *, int, size_t)
40void * 51 __asm__(__USER_LABEL_PREFIX__ "memset");
41__fortify_memset(void *dest, int c, size_t n) 52extern __inline __attribute__((__always_inline__,__gnu_inline__))
53void *memset(void *dest, int c, size_t n)
42{ 54{
43 size_t bos = __builtin_object_size(dest, 0); 55 size_t bos = __builtin_object_size(dest, 0);
44 56
45 if (n > bos) 57 if (n > bos)
46 __builtin_trap(); 58 __builtin_trap();
47 return memset(dest, c, n); 59 return __memset_orig(dest, c, n);
48} 60}
49 61
50static inline __attribute__ ((always_inline)) 62extern char *__stpcpy_orig(char *, const char *)
51char * 63 __asm__(__USER_LABEL_PREFIX__ "stpcpy");
52__fortify_stpcpy(char *dest, const char *src) 64extern __inline __attribute__((__always_inline__,__gnu_inline__))
65char *stpcpy(char *dest, const char *src)
53{ 66{
54 size_t bos = __builtin_object_size(dest, 0); 67 size_t bos = __builtin_object_size(dest, 0);
55 68
56 if (strlen(src) + 1 > bos) 69 if (strlen(src) + 1 > bos)
57 __builtin_trap(); 70 __builtin_trap();
58 return stpcpy(dest, src); 71 return __stpcpy_orig(dest, src);
59} 72}
60 73
61static inline __attribute__ ((always_inline)) 74extern char *__stpncpy_orig(char *, const char *, size_t)
62char * 75 __asm__(__USER_LABEL_PREFIX__ "stpncpy");
63__fortify_stpncpy(char *dest, const char *src, size_t n) 76extern __inline __attribute__((__always_inline__,__gnu_inline__))
77char *stpncpy(char *dest, const char *src, size_t n)
64{ 78{
65 size_t bos = __builtin_object_size(dest, 0); 79 size_t bos = __builtin_object_size(dest, 0);
66 80
67 if (n > bos) 81 if (n > bos)
68 __builtin_trap(); 82 __builtin_trap();
69 return stpncpy(dest, src, n); 83 return __stpncpy_orig(dest, src, n);
70} 84}
71 85
72static inline __attribute__ ((always_inline)) 86extern char *__strcat_orig(char *, const char *)
73char * 87 __asm__(__USER_LABEL_PREFIX__ "strcat");
74__fortify_strcat(char *dest, const char *src) 88extern __inline __attribute__((__always_inline__,__gnu_inline__))
89char *strcat(char *dest, const char *src)
75{ 90{
76 size_t bos = __builtin_object_size(dest, 0); 91 size_t bos = __builtin_object_size(dest, 0);
77 92
78 if (strlen(src) + strlen(dest) + 1 > bos) 93 if (strlen(src) + strlen(dest) + 1 > bos)
79 __builtin_trap(); 94 __builtin_trap();
80 return strcat(dest, src); 95 return __strcat_orig(dest, src);
81} 96}
82 97
83static inline __attribute__ ((always_inline)) 98extern char *__strcpy_orig(char *, const char *)
84char * 99 __asm__(__USER_LABEL_PREFIX__ "strcpy");
85__fortify_strcpy(char *dest, const char *src) 100extern __inline __attribute__((__always_inline__,__gnu_inline__))
101char *strcpy(char *dest, const char *src)
86{ 102{
87 size_t bos = __builtin_object_size(dest, 0); 103 size_t bos = __builtin_object_size(dest, 0);
88 104
89 if (strlen(src) + 1 > bos) 105 if (strlen(src) + 1 > bos)
90 __builtin_trap(); 106 __builtin_trap();
91 return strcpy(dest, src); 107 return __strcpy_orig(dest, src);
92} 108}
93 109
94static inline __attribute__ ((always_inline)) 110extern char *__strncat_orig(char *, const char *, size_t)
95char * 111 __asm__(__USER_LABEL_PREFIX__ "strncat");
96__fortify_strncat(char *dest, const char *src, size_t n) 112extern __inline __attribute__((__always_inline__,__gnu_inline__))
113char *strncat(char *dest, const char *src, size_t n)
97{ 114{
98 size_t bos = __builtin_object_size(dest, 0); 115 size_t bos = __builtin_object_size(dest, 0);
99 size_t slen, dlen; 116 size_t slen, dlen;
@@ -106,88 +123,64 @@ __fortify_strncat(char *dest, const char *src, size_t n)
106 if (slen + dlen + 1 > bos) 123 if (slen + dlen + 1 > bos)
107 __builtin_trap(); 124 __builtin_trap();
108 } 125 }
109 return strncat(dest, src, n); 126 return __strncat_orig(dest, src, n);
110} 127}
111 128
112static inline __attribute__ ((always_inline)) 129extern char *__strncpy_orig(char *, const char *, size_t)
113char * 130 __asm__(__USER_LABEL_PREFIX__ "strncpy");
114__fortify_strncpy(char *dest, const char *src, size_t n) 131extern __inline __attribute__((__always_inline__,__gnu_inline__))
132char *strncpy(char *dest, const char *src, size_t n)
115{ 133{
116 size_t bos = __builtin_object_size(dest, 0); 134 size_t bos = __builtin_object_size(dest, 0);
117 135
118 if (n > bos) 136 if (n > bos)
119 __builtin_trap(); 137 __builtin_trap();
120 return strncpy(dest, src, n); 138 return __strncpy_orig(dest, src, n);
121} 139}
122 140
123#ifdef _GNU_SOURCE 141#ifdef _GNU_SOURCE
124static inline __attribute__ ((always_inline)) 142#undef mempcpy
125void * 143extern void *__mempcpy_orig(void *, const void *, size_t n)
126__fortify_mempcpy(void *dest, const void *src, size_t n) 144 __asm__(__USER_LABEL_PREFIX__ "mempcpy");
145extern __inline __attribute__((__always_inline__,__gnu_inline__))
146void *mempcpy(void *dest, const void *src, size_t n)
127{ 147{
128 size_t bos = __builtin_object_size(dest, 0); 148 size_t bos = __builtin_object_size(dest, 0);
129 149
130 if (n > bos) 150 if (n > bos)
131 __builtin_trap(); 151 __builtin_trap();
132 return mempcpy(dest, src, n); 152 return __mempcpy_orig(dest, src, n);
133} 153}
134#endif 154#endif
135 155
136#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) 156#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
137static inline __attribute__ ((always_inline)) 157#undef strlcat
138size_t 158#undef strlcpy
139__fortify_strlcat(char *dest, const char *src, size_t n) 159extern size_t __strlcat_orig(char *, const char *, size_t)
160 __asm__(__USER_LABEL_PREFIX__ "strlcat");
161extern __inline __attribute__((__always_inline__,__gnu_inline__))
162size_t strlcat(char *dest, const char *src, size_t n)
140{ 163{
141 size_t bos = __builtin_object_size(dest, 0); 164 size_t bos = __builtin_object_size(dest, 0);
142 165
143 if (n > bos) 166 if (n > bos)
144 __builtin_trap(); 167 __builtin_trap();
145 return strlcat(dest, src, n); 168 return __strlcat_orig(dest, src, n);
146} 169}
147 170
148static inline __attribute__ ((always_inline)) 171extern size_t __strlcpy_orig(char *, const char *, size_t)
149size_t 172 __asm__(__USER_LABEL_PREFIX__ "strlcpy");
150__fortify_strlcpy(char *dest, const char *src, size_t n) 173extern __inline __attribute__((__always_inline__,__gnu_inline__))
174size_t strlcpy(char *dest, const char *src, size_t n)
151{ 175{
152 size_t bos = __builtin_object_size(dest, 0); 176 size_t bos = __builtin_object_size(dest, 0);
153 177
154 if (n > bos) 178 if (n > bos)
155 __builtin_trap(); 179 __builtin_trap();
156 return strlcpy(dest, src, n); 180 return __strlcpy_orig(dest, src, n);
157} 181}
158#endif 182#endif
159 183
160#undef memcpy
161#define memcpy(dest, src, n) __fortify_memcpy(dest, src, n)
162#undef memmove
163#define memmove(dest, src, n) __fortify_memmove(dest, src, n)
164#undef memset
165#define memset(dest, src, n) __fortify_memset(dest, src, n)
166#undef stpcpy
167#define stpcpy(dest, src) __fortify_stpcpy(dest, src)
168#undef stpncpy
169#define stpncpy(dest, src, n) __fortify_stpncpy(dest, src, n)
170#undef strcat
171#define strcat(dest, src) __fortify_strcat(dest, src)
172#undef strcpy
173#define strcpy(dest, src) __fortify_strcpy(dest, src)
174#undef strncat
175#define strncat(dest, src, n) __fortify_strncat(dest, src, n)
176#undef strncpy
177#define strncpy(dest, src, n) __fortify_strncpy(dest, src, n)
178
179#ifdef _GNU_SOURCE
180#undef mempcpy
181#define mempcpy(dest, src, n) __fortify_mempcpy(dest, src, n)
182#endif
183
184#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
185#undef strlcat
186#define strlcat(dest, src, n) __fortify_strlcat(dest, src, n)
187#undef strlcpy
188#define strlcpy(dest, src, n) __fortify_strlcpy(dest, src, n)
189#endif
190
191#endif 184#endif
192 185
193#endif 186#endif