summaryrefslogtreecommitdiff
path: root/include/stdio.h
diff options
context:
space:
mode:
authorsin2015-01-28 17:08:27 +0000
committersin2015-01-28 17:08:37 +0000
commit5960e3364f54eebfbfe509abc6c629d26171734b (patch)
tree2858983c770cafa601b79510579f632f1611465d /include/stdio.h
parentb4a9df1a083cd519005895e81433a685cde3fc34 (diff)
Add snprintf() checks
We need to use a variadic macro in this case because GCC doesn't allow inline functions with variable argument lists.
Diffstat (limited to 'include/stdio.h')
-rw-r--r--include/stdio.h12
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