diff options
| author | sin | 2015-03-01 12:10:40 +0000 |
|---|---|---|
| committer | sin | 2015-03-01 12:10:40 +0000 |
| commit | 488c3c7183788de425a7854aa0008fe795241546 (patch) | |
| tree | 01a66cdccd7dc7913779402c5f570509146176fb /include | |
| parent | 66b34fbe593a3b2087d2276957b47a5bab567f18 (diff) | |
Add vsprintf() check
Diffstat (limited to 'include')
| -rw-r--r-- | include/stdio.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/include/stdio.h b/include/stdio.h index 3e24044..8486804 100644 --- a/include/stdio.h +++ b/include/stdio.h | |||
| @@ -18,6 +18,26 @@ __fortify_fgets(char *s, int n, FILE *fp) | |||
| 18 | 18 | ||
| 19 | static inline | 19 | static inline |
| 20 | __attribute__ ((always_inline)) | 20 | __attribute__ ((always_inline)) |
| 21 | __attribute__ ((__format__ (printf, 2, 0))) | ||
| 22 | __attribute__ ((__nonnull__ (2))) | ||
| 23 | int | ||
| 24 | __fortify_vsprintf(char *s, const char *fmt, __builtin_va_list ap) | ||
| 25 | { | ||
| 26 | size_t bos = __builtin_object_size(s, 0); | ||
| 27 | int r; | ||
| 28 | |||
| 29 | if (bos != -1) { | ||
| 30 | r = vsnprintf(s, bos, fmt, ap); | ||
| 31 | if (r == -1 || (size_t)r >= bos) | ||
| 32 | __builtin_trap(); | ||
| 33 | } else { | ||
| 34 | r = vsprintf(s, fmt, ap); | ||
| 35 | } | ||
| 36 | return r; | ||
| 37 | } | ||
| 38 | |||
| 39 | static inline | ||
| 40 | __attribute__ ((always_inline)) | ||
| 21 | __attribute__ ((__format__ (printf, 3, 0))) | 41 | __attribute__ ((__format__ (printf, 3, 0))) |
| 22 | __attribute__ ((__nonnull__ (3))) | 42 | __attribute__ ((__nonnull__ (3))) |
| 23 | int | 43 | int |
| @@ -32,6 +52,8 @@ __fortify_vsnprintf(char *s, size_t n, const char *fmt, __builtin_va_list ap) | |||
| 32 | 52 | ||
| 33 | #undef fgets | 53 | #undef fgets |
| 34 | #define fgets(s, n, fp) __fortify_fgets(s, n, fp) | 54 | #define fgets(s, n, fp) __fortify_fgets(s, n, fp) |
| 55 | #undef vsprintf | ||
| 56 | #define vsprintf(s, fmt, ap) __fortify_vsprintf(s, fmt, ap) | ||
| 35 | #undef vsnprintf | 57 | #undef vsnprintf |
| 36 | #define vsnprintf(s, n, fmt, ap) __fortify_vsnprintf(s, n, fmt, ap) | 58 | #define vsnprintf(s, n, fmt, ap) __fortify_vsnprintf(s, n, fmt, ap) |
| 37 | 59 | ||
