diff options
| -rw-r--r-- | include/stdio.h | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/include/stdio.h b/include/stdio.h index dce15f7..237ccb0 100644 --- a/include/stdio.h +++ b/include/stdio.h | |||
| @@ -13,15 +13,21 @@ int __fortify_vsnprintf(char *__restrict s, size_t n, const char *__restrict fmt | |||
| 13 | { | 13 | { |
| 14 | size_t bos = __builtin_object_size(s, 0); | 14 | size_t bos = __builtin_object_size(s, 0); |
| 15 | 15 | ||
| 16 | if (bos == (size_t)-1) | 16 | if (n > bos) |
| 17 | return vsnprintf(s, n, fmt, ap); | ||
| 18 | if (__builtin_constant_p(n) && n > bos) | ||
| 19 | __builtin_trap(); | 17 | __builtin_trap(); |
| 20 | return vsnprintf(s, n, fmt, ap); | 18 | return vsnprintf(s, n, fmt, ap); |
| 21 | } | 19 | } |
| 22 | 20 | ||
| 23 | #undef vsnprintf | 21 | #undef vsnprintf |
| 24 | #define vsnprintf(s, n, fmt, ap) __fortify_vsnprintf(s, n, fmt, ap) | 22 | #define vsnprintf(s, n, fmt, ap) __fortify_vsnprintf(s, n, fmt, ap) |
| 23 | #undef snprintf | ||
| 24 | #define snprintf(s, n, fmt, ...) ({ \ | ||
| 25 | size_t _n = (n); \ | ||
| 26 | size_t bos = __builtin_object_size(s, 0); \ | ||
| 27 | if (n > bos) \ | ||
| 28 | __builtin_trap(); \ | ||
| 29 | snprintf(s, n, fmt, __VA_ARGS__); \ | ||
| 30 | }) | ||
| 25 | 31 | ||
| 26 | #endif | 32 | #endif |
| 27 | 33 | ||
