diff options
| author | sin | 2015-03-13 11:00:46 +0000 |
|---|---|---|
| committer | sin | 2015-03-13 11:00:46 +0000 |
| commit | 9f8c543dc81f0c4239acae6713f5414eb7dc681d (patch) | |
| tree | 0c8dad17e27c510cc3c98502841aa1a75dfa3d1e /include/strings.h | |
| parent | b211796d68c4a6b56f999534627791f3576b6135 (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.h | 25 |
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) |
| 13 | static inline __attribute__ ((always_inline)) | 13 | #undef bcopy |
| 14 | void | 14 | #undef bzero |
| 15 | __fortify_bcopy(const void *src, void *dest, size_t n) | 15 | extern void __bcopy_orig(const void *, void *, size_t) |
| 16 | __asm__(__USER_LABEL_PREFIX__ "bcopy"); | ||
| 17 | extern __inline __attribute__((__always_inline__,__gnu_inline__)) | ||
| 18 | void 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 | ||
| 24 | static inline __attribute__ ((always_inline)) | 27 | extern void __bzero_orig(void *, size_t) |
| 25 | void | 28 | __asm__(__USER_LABEL_PREFIX__ "bzero"); |
| 26 | __fortify_bzero(void *src, size_t n) | 29 | extern __inline __attribute__((__always_inline__,__gnu_inline__)) |
| 30 | void 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 |
