summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/wchar.h42
1 files changed, 24 insertions, 18 deletions
diff --git a/include/wchar.h b/include/wchar.h
index 916e91a..16895e5 100644
--- a/include/wchar.h
+++ b/include/wchar.h
@@ -23,16 +23,19 @@ __fortify_mbsnrtowcs(wchar_t *d, const char **s, size_t n,
23 size_t wn, mbstate_t *st) 23 size_t wn, mbstate_t *st)
24{ 24{
25 size_t bos = __builtin_object_size(d, 0); 25 size_t bos = __builtin_object_size(d, 0);
26 size_t actual; 26 size_t r;
27 27
28 if (wn > (size_t)-1 / sizeof(wchar_t)) 28 if (wn > n / sizeof(wchar_t)) {
29 __builtin_trap(); 29 bos /= sizeof(wchar_t);
30 actual = wn * sizeof(wchar_t); 30 r = mbsnrtowcs(d, s, n, wn > bos ? bos : wn, st);
31 if (actual > n) 31 if (bos < wn && d && *s && r != (size_t)-1)
32 actual = n; 32 __builtin_trap();
33 if (actual > bos) 33 } else {
34 __builtin_trap(); 34 r = mbsnrtowcs(d, s, n > bos ? bos : n, wn, st);
35 return mbsnrtowcs(d, s, n, wn, st); 35 if (bos < n && d && *s && r != (size_t)-1)
36 __builtin_trap();
37 }
38 return r;
36} 39}
37 40
38static inline __attribute__ ((always_inline)) 41static inline __attribute__ ((always_inline))
@@ -129,16 +132,19 @@ __fortify_wcsnrtombs(char *d, const wchar_t **s, size_t wn,
129 size_t n, mbstate_t *st) 132 size_t n, mbstate_t *st)
130{ 133{
131 size_t bos = __builtin_object_size(d, 0); 134 size_t bos = __builtin_object_size(d, 0);
132 size_t actual; 135 size_t r;
133 136
134 if (wn > (size_t)-1 / sizeof(wchar_t)) 137 if (wn > n / sizeof(wchar_t)) {
135 __builtin_trap(); 138 bos /= sizeof(wchar_t);
136 actual = wn * sizeof(wchar_t); 139 r = wcsnrtombs(d, s, wn > bos ? bos : wn, n, st);
137 if (actual > n) 140 if (bos < wn && d && *s && r != (size_t)-1)
138 actual = n; 141 __builtin_trap();
139 if (actual > bos) 142 } else {
140 __builtin_trap(); 143 r = wcsnrtombs(d, s, wn, n > bos ? bos : n, st);
141 return wcsnrtombs(d, s, wn, n, st); 144 if (bos < n && d && *s && r != (size_t)-1)
145 __builtin_trap();
146 }
147 return r;
142} 148}
143 149
144static inline __attribute__ ((always_inline)) 150static inline __attribute__ ((always_inline))