summaryrefslogtreecommitdiff
path: root/include/wchar.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/wchar.h')
-rw-r--r--include/wchar.h11
1 files changed, 5 insertions, 6 deletions
diff --git a/include/wchar.h b/include/wchar.h
index 09ffa97..c5d0e5d 100644
--- a/include/wchar.h
+++ b/include/wchar.h
@@ -111,15 +111,14 @@ _FORTIFY_FN(mbstowcs) size_t mbstowcs(wchar_t *__ws, const char *__s, size_t __w
111 111
112_FORTIFY_FN(wcrtomb) size_t wcrtomb(char *__s, wchar_t __w, mbstate_t *__st) 112_FORTIFY_FN(wcrtomb) size_t wcrtomb(char *__s, wchar_t __w, mbstate_t *__st)
113{ 113{
114 char __buf[MB_LEN_MAX]; 114 if (__s && MB_LEN_MAX > __builtin_object_size(__s, 2)) {
115 size_t __b = __builtin_object_size(__s, 0); 115 char __buf[MB_LEN_MAX];
116 size_t __r; 116 size_t __r;
117 117
118 if (__s) {
119 __r = __orig_wcrtomb(__buf, __w, __st); 118 __r = __orig_wcrtomb(__buf, __w, __st);
120 if (__r == (size_t)-1) 119 if (__r == (size_t)-1)
121 return __r; 120 return __r;
122 if (__r > __b) 121 if (__r > __builtin_object_size(__s, 0))
123 __builtin_trap(); 122 __builtin_trap();
124 __builtin_memcpy(__s, __buf, __r); 123 __builtin_memcpy(__s, __buf, __r);
125 return __r; 124 return __r;
@@ -218,7 +217,7 @@ _FORTIFY_FN(wctomb) int wctomb(char *__s, wchar_t __w)
218{ 217{
219 size_t __b = __builtin_object_size(__s, 0); 218 size_t __b = __builtin_object_size(__s, 0);
220 219
221 if (__s && MB_CUR_MAX > __b) 220 if (__s && MB_LEN_MAX > __b && MB_CUR_MAX > __b)
222 __builtin_trap(); 221 __builtin_trap();
223 return __orig_wctomb(__s, __w); 222 return __orig_wctomb(__s, __w);
224} 223}