diff options
| author | sin | 2015-05-13 12:04:15 +0100 |
|---|---|---|
| committer | sin | 2015-05-13 12:05:29 +0100 |
| commit | 158782b3bb791eae3c97947944c7023452bfbc96 (patch) | |
| tree | b76e70744ab0a2f76d781a65a0456b1b010c54df /include/stdio.h | |
| parent | 316a48653315b4bc36d8c50b542471b18441c9d5 (diff) | |
Add fortify_fn() helper in fortify-headers.h
Diffstat (limited to 'include/stdio.h')
| -rw-r--r-- | include/stdio.h | 48 |
1 files changed, 18 insertions, 30 deletions
diff --git a/include/stdio.h b/include/stdio.h index ad80488..2e59e50 100644 --- a/include/stdio.h +++ b/include/stdio.h | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | #include_next <stdio.h> | 4 | #include_next <stdio.h> |
| 5 | 5 | ||
| 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 | #include "fortify-headers.h" | ||
| 7 | 8 | ||
| 8 | #ifdef __cplusplus | 9 | #ifdef __cplusplus |
| 9 | extern "C" { | 10 | extern "C" { |
| @@ -17,20 +18,16 @@ extern "C" { | |||
| 17 | #undef snprintf | 18 | #undef snprintf |
| 18 | #undef sprintf | 19 | #undef sprintf |
| 19 | 20 | ||
| 20 | __typeof__(fgets) __fgets_orig __asm__(__USER_LABEL_PREFIX__ "fgets"); | 21 | fortify_fn(fgets) char *fgets(char *s, int n, FILE *fp) |
| 21 | extern __inline __attribute__((__always_inline__,__gnu_inline__,__artificial__)) | ||
| 22 | char *fgets(char *s, int n, FILE *fp) | ||
| 23 | { | 22 | { |
| 24 | size_t bos = __builtin_object_size(s, 0); | 23 | size_t bos = __builtin_object_size(s, 0); |
| 25 | 24 | ||
| 26 | if ((size_t)n > bos) | 25 | if ((size_t)n > bos) |
| 27 | __builtin_trap(); | 26 | __builtin_trap(); |
| 28 | return __fgets_orig(s, n, fp); | 27 | return __orig_fgets(s, n, fp); |
| 29 | } | 28 | } |
| 30 | 29 | ||
| 31 | __typeof__(fread) __fread_orig __asm__(__USER_LABEL_PREFIX__ "fread"); | 30 | fortify_fn(fread) size_t fread(void *dst, size_t n, size_t nmemb, FILE *fp) |
| 32 | extern __inline __attribute__((__always_inline__,__gnu_inline__,__artificial__)) | ||
| 33 | size_t fread(void *dst, size_t n, size_t nmemb, FILE *fp) | ||
| 34 | { | 31 | { |
| 35 | size_t bos = __builtin_object_size(dst, 0); | 32 | size_t bos = __builtin_object_size(dst, 0); |
| 36 | 33 | ||
| @@ -38,12 +35,10 @@ size_t fread(void *dst, size_t n, size_t nmemb, FILE *fp) | |||
| 38 | __builtin_trap(); | 35 | __builtin_trap(); |
| 39 | if (n * nmemb > bos) | 36 | if (n * nmemb > bos) |
| 40 | __builtin_trap(); | 37 | __builtin_trap(); |
| 41 | return __fread_orig(dst, n, nmemb, fp); | 38 | return __orig_fread(dst, n, nmemb, fp); |
| 42 | } | 39 | } |
| 43 | 40 | ||
| 44 | __typeof__(fwrite) __fwrite_orig __asm__(__USER_LABEL_PREFIX__ "fwrite"); | 41 | fortify_fn(fwrite) size_t fwrite(const void *dst, size_t n, size_t nmemb, FILE *fp) |
| 45 | extern __inline __attribute__((__always_inline__,__gnu_inline__,__artificial__)) | ||
| 46 | size_t fwrite(const void *dst, size_t n, size_t nmemb, FILE *fp) | ||
| 47 | { | 42 | { |
| 48 | size_t bos = __builtin_object_size(dst, 0); | 43 | size_t bos = __builtin_object_size(dst, 0); |
| 49 | 44 | ||
| @@ -51,61 +46,54 @@ size_t fwrite(const void *dst, size_t n, size_t nmemb, FILE *fp) | |||
| 51 | __builtin_trap(); | 46 | __builtin_trap(); |
| 52 | if (n * nmemb > bos) | 47 | if (n * nmemb > bos) |
| 53 | __builtin_trap(); | 48 | __builtin_trap(); |
| 54 | return __fwrite_orig(dst, n, nmemb, fp); | 49 | return __orig_fwrite(dst, n, nmemb, fp); |
| 55 | } | 50 | } |
| 56 | 51 | ||
| 57 | __typeof__(vsnprintf) __vsnprintf_orig __asm__(__USER_LABEL_PREFIX__ "vsnprintf"); | 52 | fortify_fn(vsnprintf) int vsnprintf(char *s, size_t n, const char *fmt, |
| 58 | extern __inline __attribute__((__always_inline__,__gnu_inline__,__artificial__)) | 53 | __builtin_va_list ap) |
| 59 | int vsnprintf(char *s, size_t n, const char *fmt, __builtin_va_list ap) | ||
| 60 | { | 54 | { |
| 61 | size_t bos = __builtin_object_size(s, 0); | 55 | size_t bos = __builtin_object_size(s, 0); |
| 62 | 56 | ||
| 63 | if (n > bos) | 57 | if (n > bos) |
| 64 | __builtin_trap(); | 58 | __builtin_trap(); |
| 65 | return __vsnprintf_orig(s, n, fmt, ap); | 59 | return __orig_vsnprintf(s, n, fmt, ap); |
| 66 | } | 60 | } |
| 67 | 61 | ||
| 68 | __typeof__(vsprintf) __vsprintf_orig __asm__(__USER_LABEL_PREFIX__ "vsprintf"); | 62 | fortify_fn(vsprintf) int vsprintf(char *s, const char *fmt, __builtin_va_list ap) |
| 69 | extern __inline __attribute__((__always_inline__,__gnu_inline__,__artificial__)) | ||
| 70 | int vsprintf(char *s, const char *fmt, __builtin_va_list ap) | ||
| 71 | { | 63 | { |
| 72 | size_t bos = __builtin_object_size(s, 0); | 64 | size_t bos = __builtin_object_size(s, 0); |
| 73 | int r; | 65 | int r; |
| 74 | 66 | ||
| 75 | if (bos != (size_t)-1) { | 67 | if (bos != (size_t)-1) { |
| 76 | r = __vsnprintf_orig(s, bos, fmt, ap); | 68 | r = __orig_vsnprintf(s, bos, fmt, ap); |
| 77 | if (r != -1 && (size_t)r >= bos) | 69 | if (r != -1 && (size_t)r >= bos) |
| 78 | __builtin_trap(); | 70 | __builtin_trap(); |
| 79 | } else { | 71 | } else { |
| 80 | r = __vsprintf_orig(s, fmt, ap); | 72 | r = __orig_vsprintf(s, fmt, ap); |
| 81 | } | 73 | } |
| 82 | return r; | 74 | return r; |
| 83 | } | 75 | } |
| 84 | 76 | ||
| 85 | __typeof__(snprintf) __snprintf_orig __asm__(__USER_LABEL_PREFIX__ "snprintf"); | 77 | fortify_fn(snprintf) int snprintf(char *s, size_t n, const char *fmt, ...) |
| 86 | extern __inline __attribute__((__always_inline__,__gnu_inline__,__artificial__)) | ||
| 87 | int snprintf(char *s, size_t n, const char *fmt, ...) | ||
| 88 | { | 78 | { |
| 89 | size_t bos = __builtin_object_size(s, 0); | 79 | size_t bos = __builtin_object_size(s, 0); |
| 90 | 80 | ||
| 91 | if (n > bos) | 81 | if (n > bos) |
| 92 | __builtin_trap(); | 82 | __builtin_trap(); |
| 93 | return __snprintf_orig(s, n, fmt, __builtin_va_arg_pack()); | 83 | return __orig_snprintf(s, n, fmt, __builtin_va_arg_pack()); |
| 94 | } | 84 | } |
| 95 | 85 | ||
| 96 | __typeof__(sprintf) __sprintf_orig __asm__(__USER_LABEL_PREFIX__ "sprintf"); | 86 | fortify_fn(sprintf) int sprintf(char *s, const char *fmt, ...) |
| 97 | extern __inline __attribute__((__always_inline__,__gnu_inline__,__artificial__)) | ||
| 98 | int sprintf(char *s, const char *fmt, ...) | ||
| 99 | { | 87 | { |
| 100 | size_t bos = __builtin_object_size(s, 0); | 88 | size_t bos = __builtin_object_size(s, 0); |
| 101 | int r; | 89 | int r; |
| 102 | 90 | ||
| 103 | if (bos != (size_t)-1) { | 91 | if (bos != (size_t)-1) { |
| 104 | r = __snprintf_orig(s, bos, fmt, __builtin_va_arg_pack()); | 92 | r = __orig_snprintf(s, bos, fmt, __builtin_va_arg_pack()); |
| 105 | if (r != -1 && (size_t)r >= bos) | 93 | if (r != -1 && (size_t)r >= bos) |
| 106 | __builtin_trap(); | 94 | __builtin_trap(); |
| 107 | } else { | 95 | } else { |
| 108 | r = __sprintf_orig(s, fmt, __builtin_va_arg_pack()); | 96 | r = __orig_sprintf(s, fmt, __builtin_va_arg_pack()); |
| 109 | } | 97 | } |
| 110 | return r; | 98 | return r; |
| 111 | } | 99 | } |
