summaryrefslogtreecommitdiff
path: root/include/strings.h
diff options
context:
space:
mode:
authorsin2015-03-13 11:00:46 +0000
committersin2015-03-13 11:00:46 +0000
commit9f8c543dc81f0c4239acae6713f5414eb7dc681d (patch)
tree0c8dad17e27c510cc3c98502841aa1a75dfa3d1e /include/strings.h
parentb211796d68c4a6b56f999534627791f3576b6135 (diff)
Rework fortify implementation to use extern inline
Overriding functions with macros is legal in C but a lot of software is not prepared for it. Use the extern inline method to achieve the same result.
Diffstat (limited to 'include/strings.h')
-rw-r--r--include/strings.h25
1 files changed, 12 insertions, 13 deletions
diff --git a/include/strings.h b/include/strings.h
index d7118f3..1adbf51 100644
--- a/include/strings.h
+++ b/include/strings.h
@@ -10,32 +10,31 @@
10#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_POSIX_SOURCE) \ 10#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_POSIX_SOURCE) \
11 || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE+0 < 200809L) \ 11 || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE+0 < 200809L) \
12 || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE+0 < 700) 12 || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE+0 < 700)
13static inline __attribute__ ((always_inline)) 13#undef bcopy
14void 14#undef bzero
15__fortify_bcopy(const void *src, void *dest, size_t n) 15extern void __bcopy_orig(const void *, void *, size_t)
16 __asm__(__USER_LABEL_PREFIX__ "bcopy");
17extern __inline __attribute__((__always_inline__,__gnu_inline__))
18void bcopy(const void *src, void *dest, size_t n)
16{ 19{
17 size_t bos = __builtin_object_size(dest, 0); 20 size_t bos = __builtin_object_size(dest, 0);
18 21
19 if (n > bos) 22 if (n > bos)
20 __builtin_trap(); 23 __builtin_trap();
21 return bcopy(src, dest, n); 24 return __bcopy_orig(src, dest, n);
22} 25}
23 26
24static inline __attribute__ ((always_inline)) 27extern void __bzero_orig(void *, size_t)
25void 28 __asm__(__USER_LABEL_PREFIX__ "bzero");
26__fortify_bzero(void *src, size_t n) 29extern __inline __attribute__((__always_inline__,__gnu_inline__))
30void bzero(void *src, size_t n)
27{ 31{
28 size_t bos = __builtin_object_size(src, 0); 32 size_t bos = __builtin_object_size(src, 0);
29 33
30 if (n > bos) 34 if (n > bos)
31 __builtin_trap(); 35 __builtin_trap();
32 return bzero(src, n); 36 return __bzero_orig(src, n);
33} 37}
34
35#undef bcopy
36#define bcopy(src, dest, n) __fortify_bcopy(src, dest, n)
37#undef bzero
38#define bzero(src, n) __fortify_bzero(src, n)
39#endif 38#endif
40 39
41#endif 40#endif