summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/wchar.h16
1 files changed, 14 insertions, 2 deletions
diff --git a/include/wchar.h b/include/wchar.h
index 4d329a8..9e5413f 100644
--- a/include/wchar.h
+++ b/include/wchar.h
@@ -23,8 +23,14 @@ __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 27
27 if (wn > bos / sizeof(wchar_t)) 28 if (wn > (size_t)-1 / sizeof(wchar_t))
29 __builtin_trap();
30 actual = wn * sizeof(wchar_t);
31 if (actual > n)
32 actual = n;
33 if (actual > bos)
28 __builtin_trap(); 34 __builtin_trap();
29 return mbsnrtowcs(d, s, n, wn, st); 35 return mbsnrtowcs(d, s, n, wn, st);
30} 36}
@@ -120,8 +126,14 @@ __fortify_wcsnrtombs(char *d, const wchar_t **s, size_t wn,
120 size_t n, mbstate_t *st) 126 size_t n, mbstate_t *st)
121{ 127{
122 size_t bos = __builtin_object_size(d, 0); 128 size_t bos = __builtin_object_size(d, 0);
129 size_t actual;
123 130
124 if (n > bos) 131 if (wn > (size_t)-1 / sizeof(wchar_t))
132 __builtin_trap();
133 actual = wn * sizeof(wchar_t);
134 if (actual > n)
135 actual = n;
136 if (actual > bos)
125 __builtin_trap(); 137 __builtin_trap();
126 return wcsnrtombs(d, s, wn, n, st); 138 return wcsnrtombs(d, s, wn, n, st);
127} 139}