summaryrefslogtreecommitdiff
path: root/include/stdio.h
diff options
context:
space:
mode:
authorsin2015-05-13 12:04:15 +0100
committersin2015-05-13 12:05:29 +0100
commit158782b3bb791eae3c97947944c7023452bfbc96 (patch)
treeb76e70744ab0a2f76d781a65a0456b1b010c54df /include/stdio.h
parent316a48653315b4bc36d8c50b542471b18441c9d5 (diff)
Add fortify_fn() helper in fortify-headers.h
Diffstat (limited to 'include/stdio.h')
-rw-r--r--include/stdio.h48
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
9extern "C" { 10extern "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"); 21fortify_fn(fgets) char *fgets(char *s, int n, FILE *fp)
21extern __inline __attribute__((__always_inline__,__gnu_inline__,__artificial__))
22char *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"); 30fortify_fn(fread) size_t fread(void *dst, size_t n, size_t nmemb, FILE *fp)
32extern __inline __attribute__((__always_inline__,__gnu_inline__,__artificial__))
33size_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"); 41fortify_fn(fwrite) size_t fwrite(const void *dst, size_t n, size_t nmemb, FILE *fp)
45extern __inline __attribute__((__always_inline__,__gnu_inline__,__artificial__))
46size_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"); 52fortify_fn(vsnprintf) int vsnprintf(char *s, size_t n, const char *fmt,
58extern __inline __attribute__((__always_inline__,__gnu_inline__,__artificial__)) 53 __builtin_va_list ap)
59int 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"); 62fortify_fn(vsprintf) int vsprintf(char *s, const char *fmt, __builtin_va_list ap)
69extern __inline __attribute__((__always_inline__,__gnu_inline__,__artificial__))
70int 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"); 77fortify_fn(snprintf) int snprintf(char *s, size_t n, const char *fmt, ...)
86extern __inline __attribute__((__always_inline__,__gnu_inline__,__artificial__))
87int 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"); 86fortify_fn(sprintf) int sprintf(char *s, const char *fmt, ...)
97extern __inline __attribute__((__always_inline__,__gnu_inline__,__artificial__))
98int 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}