summaryrefslogtreecommitdiff
path: root/include/wchar.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/wchar.h')
-rw-r--r--include/wchar.h15
1 files changed, 13 insertions, 2 deletions
diff --git a/include/wchar.h b/include/wchar.h
index 0d4abfa..d87e195 100644
--- a/include/wchar.h
+++ b/include/wchar.h
@@ -17,8 +17,12 @@
17#define _FORTIFY_WCHAR_H 17#define _FORTIFY_WCHAR_H
18 18
19__extension__ 19__extension__
20#include_next <limits.h>
21__extension__
20#include_next <stdlib.h> 22#include_next <stdlib.h>
21__extension__ 23__extension__
24#include_next <string.h>
25__extension__
22#include_next <wchar.h> 26#include_next <wchar.h>
23 27
24#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0 28#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0
@@ -99,10 +103,17 @@ _FORTIFY_FN(mbstowcs) size_t mbstowcs(wchar_t *__ws, const char *__s, size_t __w
99 103
100_FORTIFY_FN(wcrtomb) size_t wcrtomb(char *__s, wchar_t __w, mbstate_t *__st) 104_FORTIFY_FN(wcrtomb) size_t wcrtomb(char *__s, wchar_t __w, mbstate_t *__st)
101{ 105{
106 char __buf[MB_LEN_MAX];
102 size_t __b = __builtin_object_size(__s, 0); 107 size_t __b = __builtin_object_size(__s, 0);
108 size_t __r;
103 109
104 if (__s && MB_CUR_MAX > __b) 110 if (__s) {
105 __builtin_trap(); 111 __r = __orig_wcrtomb(__buf, __w, __st);
112 if (__r > __b)
113 __builtin_trap();
114 memcpy(__s, __buf, __r);
115 return __r;
116 }
106 return __orig_wcrtomb(__s, __w, __st); 117 return __orig_wcrtomb(__s, __w, __st);
107} 118}
108 119