summaryrefslogtreecommitdiff
path: root/include/strings.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/strings.h')
-rw-r--r--include/strings.h10
1 files changed, 10 insertions, 0 deletions
diff --git a/include/strings.h b/include/strings.h
index c2f3bcd..4086fe4 100644
--- a/include/strings.h
+++ b/include/strings.h
@@ -6,26 +6,36 @@
6 6
7#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0 7#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0
8 8
9#define __errordecl(name, msg) extern void name(void) __attribute__((__error__(msg)))
10
9#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_POSIX_SOURCE) \ 11#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_POSIX_SOURCE) \
10 || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE+0 < 200809L) \ 12 || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE+0 < 200809L) \
11 || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE+0 < 700) 13 || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE+0 < 700)
14__errordecl(__bcopy_error, "bcopy: buffer overflow detected");
12static inline __attribute__ ((always_inline)) 15static inline __attribute__ ((always_inline))
13void 16void
14__fortify_bcopy(const void *__restrict src, void *__restrict dest, size_t n) 17__fortify_bcopy(const void *__restrict src, void *__restrict dest, size_t n)
15{ 18{
16 size_t bos = __builtin_object_size(dest, 0); 19 size_t bos = __builtin_object_size(dest, 0);
17 20
21 if (__builtin_constant_p(n) && n > bos)
22 __bcopy_error();
23
18 if (n > bos) 24 if (n > bos)
19 __builtin_trap(); 25 __builtin_trap();
20 return bcopy(src, dest, n); 26 return bcopy(src, dest, n);
21} 27}
22 28
29__errordecl(__bzero_error, "bzero: buffer overflow detected");
23static inline __attribute__ ((always_inline)) 30static inline __attribute__ ((always_inline))
24void 31void
25__fortify_bzero(void *src, size_t n) 32__fortify_bzero(void *src, size_t n)
26{ 33{
27 size_t bos = __builtin_object_size(src, 0); 34 size_t bos = __builtin_object_size(src, 0);
28 35
36 if (__builtin_constant_p(n) && n > bos)
37 __bzero_error();
38
29 if (n > bos) 39 if (n > bos)
30 __builtin_trap(); 40 __builtin_trap();
31 return bzero(src, n); 41 return bzero(src, n);