diff options
Diffstat (limited to 'include/wchar.h')
| -rw-r--r-- | include/wchar.h | 106 |
1 files changed, 34 insertions, 72 deletions
diff --git a/include/wchar.h b/include/wchar.h index e696ddf..7a2a192 100644 --- a/include/wchar.h +++ b/include/wchar.h | |||
| @@ -20,18 +20,6 @@ | |||
| 20 | #if !defined(__cplusplus) && !defined(__clang__) | 20 | #if !defined(__cplusplus) && !defined(__clang__) |
| 21 | __extension__ | 21 | __extension__ |
| 22 | #endif | 22 | #endif |
| 23 | #include_next <limits.h> | ||
| 24 | #if !defined(__cplusplus) && !defined(__clang__) | ||
| 25 | __extension__ | ||
| 26 | #endif | ||
| 27 | #include_next <stdlib.h> | ||
| 28 | #if !defined(__cplusplus) && !defined(__clang__) | ||
| 29 | __extension__ | ||
| 30 | #endif | ||
| 31 | #include_next <string.h> | ||
| 32 | #if !defined(__cplusplus) && !defined(__clang__) | ||
| 33 | __extension__ | ||
| 34 | #endif | ||
| 35 | #include_next <wchar.h> | 23 | #include_next <wchar.h> |
| 36 | 24 | ||
| 37 | #if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0 | 25 | #if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0 |
| @@ -43,15 +31,12 @@ extern "C" { | |||
| 43 | 31 | ||
| 44 | #undef fgetws | 32 | #undef fgetws |
| 45 | #undef mbsrtowcs | 33 | #undef mbsrtowcs |
| 46 | #undef mbstowcs | ||
| 47 | #undef wcrtomb | 34 | #undef wcrtomb |
| 48 | #undef wcscat | 35 | #undef wcscat |
| 49 | #undef wcscpy | 36 | #undef wcscpy |
| 50 | #undef wcsncat | 37 | #undef wcsncat |
| 51 | #undef wcsncpy | 38 | #undef wcsncpy |
| 52 | #undef wcsrtombs | 39 | #undef wcsrtombs |
| 53 | #undef wcstombs | ||
| 54 | #undef wctomb | ||
| 55 | #undef wmemcpy | 40 | #undef wmemcpy |
| 56 | #undef wmemmove | 41 | #undef wmemmove |
| 57 | #undef wmemset | 42 | #undef wmemset |
| @@ -62,9 +47,9 @@ __diagnose_as_builtin(__builtin_fgetws, 1, 2, 3) | |||
| 62 | _FORTIFY_FN(fgetws) wchar_t *fgetws(wchar_t * _FORTIFY_POS0 __s, | 47 | _FORTIFY_FN(fgetws) wchar_t *fgetws(wchar_t * _FORTIFY_POS0 __s, |
| 63 | int __n, FILE *__f) | 48 | int __n, FILE *__f) |
| 64 | { | 49 | { |
| 65 | size_t __b = __bos(__s, 0); | 50 | __fh_size_t __b = __bos(__s, 0); |
| 66 | 51 | ||
| 67 | if ((size_t)__n > __b / sizeof(wchar_t)) | 52 | if ((__fh_size_t)__n > __b / sizeof(wchar_t)) |
| 68 | __builtin_trap(); | 53 | __builtin_trap(); |
| 69 | return __orig_fgetws(__s, __n, __f); | 54 | return __orig_fgetws(__s, __n, __f); |
| 70 | } | 55 | } |
| @@ -79,17 +64,17 @@ _FORTIFY_FN(mbsnrtowcs) size_t mbsnrtowcs(wchar_t * _FORTIFY_POS0 __d, | |||
| 79 | const char **__s, size_t __n, | 64 | const char **__s, size_t __n, |
| 80 | size_t __wn, mbstate_t *__st) | 65 | size_t __wn, mbstate_t *__st) |
| 81 | { | 66 | { |
| 82 | size_t __b = __bos(__d, 0); | 67 | __fh_size_t __b = __bos(__d, 0); |
| 83 | size_t __r; | 68 | __fh_size_t __r; |
| 84 | 69 | ||
| 85 | if (__wn > __n / sizeof(wchar_t)) { | 70 | if (__wn > __n / sizeof(wchar_t)) { |
| 86 | __b /= sizeof(wchar_t); | 71 | __b /= sizeof(wchar_t); |
| 87 | __r = __orig_mbsnrtowcs(__d, __s, __n, __wn > __b ? __b : __wn, __st); | 72 | __r = __orig_mbsnrtowcs(__d, __s, __n, __wn > __b ? __b : __wn, __st); |
| 88 | if (__b < __wn && __d && *__s && __r != (size_t)-1) | 73 | if (__b < __wn && __d && *__s && __r != (__fh_size_t)-1) |
| 89 | __builtin_trap(); | 74 | __builtin_trap(); |
| 90 | } else { | 75 | } else { |
| 91 | __r = __orig_mbsnrtowcs(__d, __s, __n > __b ? __b : __n, __wn, __st); | 76 | __r = __orig_mbsnrtowcs(__d, __s, __n > __b ? __b : __n, __wn, __st); |
| 92 | if (__b < __n && __d && *__s && __r != (size_t)-1) | 77 | if (__b < __n && __d && *__s && __r != (__fh_size_t)-1) |
| 93 | __builtin_trap(); | 78 | __builtin_trap(); |
| 94 | } | 79 | } |
| 95 | return __r; | 80 | return __r; |
| @@ -103,29 +88,16 @@ _FORTIFY_FN(mbsrtowcs) size_t mbsrtowcs(wchar_t * _FORTIFY_POS0 __d, | |||
| 103 | const char **__s, size_t __wn, | 88 | const char **__s, size_t __wn, |
| 104 | mbstate_t *__st) | 89 | mbstate_t *__st) |
| 105 | { | 90 | { |
| 106 | size_t __b = __bos(__d, 0); | 91 | __fh_size_t __b = __bos(__d, 0); |
| 107 | size_t __r; | 92 | __fh_size_t __r; |
| 108 | 93 | ||
| 109 | __b /= sizeof(wchar_t); | 94 | __b /= sizeof(wchar_t); |
| 110 | __r = __orig_mbsrtowcs(__d, __s, __wn > __b ? __b : __wn, __st); | 95 | __r = __orig_mbsrtowcs(__d, __s, __wn > __b ? __b : __wn, __st); |
| 111 | if (__b < __wn && __d && *__s && __r != (size_t)-1) | 96 | if (__b < __wn && __d && *__s && __r != (__fh_size_t)-1) |
| 112 | __builtin_trap(); | 97 | __builtin_trap(); |
| 113 | return __r; | 98 | return __r; |
| 114 | } | 99 | } |
| 115 | 100 | ||
| 116 | #if __has_builtin(__builtin_mbstowcs) | ||
| 117 | __diagnose_as_builtin(__builtin_mbstowcs, 1, 2, 3) | ||
| 118 | #endif | ||
| 119 | _FORTIFY_FN(mbstowcs) size_t mbstowcs(wchar_t * _FORTIFY_POS0 __ws, | ||
| 120 | const char *__s, size_t __wn) | ||
| 121 | { | ||
| 122 | size_t __b = __bos(__ws, 0); | ||
| 123 | |||
| 124 | if (__ws && __wn > __b / sizeof(wchar_t)) | ||
| 125 | __builtin_trap(); | ||
| 126 | return __orig_mbstowcs(__ws, __s, __wn); | ||
| 127 | } | ||
| 128 | |||
| 129 | /* FIXME clang */ | 101 | /* FIXME clang */ |
| 130 | #ifndef __clang__ | 102 | #ifndef __clang__ |
| 131 | #if __has_builtin(__builtin_wcrtomb) | 103 | #if __has_builtin(__builtin_wcrtomb) |
| @@ -133,12 +105,13 @@ __diagnose_as_builtin(__builtin_wcrtomb, 1, 2, 3) | |||
| 133 | #endif | 105 | #endif |
| 134 | _FORTIFY_FN(wcrtomb) size_t wcrtomb(char * __s, wchar_t __w, mbstate_t *__st) | 106 | _FORTIFY_FN(wcrtomb) size_t wcrtomb(char * __s, wchar_t __w, mbstate_t *__st) |
| 135 | { | 107 | { |
| 136 | if (__s && MB_LEN_MAX > __bos(__s, 2)) { | 108 | // In glibc, MB_LEN_MAX is typically 16 (6 in glibc versions earlier than 2.2) |
| 137 | char __buf[MB_LEN_MAX]; | 109 | if (__s && 16 > __bos(__s, 2)) { |
| 138 | size_t __r; | 110 | char __buf[16]; |
| 111 | __fh_size_t __r; | ||
| 139 | 112 | ||
| 140 | __r = __orig_wcrtomb(__buf, __w, __st); | 113 | __r = __orig_wcrtomb(__buf, __w, __st); |
| 141 | if (__r == (size_t)-1) | 114 | if (__r == (__fh_size_t)-1) |
| 142 | return __r; | 115 | return __r; |
| 143 | if (__r > __bos(__s, 0)) | 116 | if (__r > __bos(__s, 0)) |
| 144 | __builtin_trap(); | 117 | __builtin_trap(); |
| @@ -155,7 +128,7 @@ __diagnose_as_builtin(__builtin_wcscat, 1, 2) | |||
| 155 | _FORTIFY_FN(wcscat) wchar_t *wcscat(wchar_t * _FORTIFY_POS0 __d, | 128 | _FORTIFY_FN(wcscat) wchar_t *wcscat(wchar_t * _FORTIFY_POS0 __d, |
| 156 | const wchar_t *__s) | 129 | const wchar_t *__s) |
| 157 | { | 130 | { |
| 158 | size_t __b = __bos(__d, 0); | 131 | __fh_size_t __b = __bos(__d, 0); |
| 159 | 132 | ||
| 160 | if (wcslen(__s) + wcslen(__d) + 1 > __b / sizeof(wchar_t)) | 133 | if (wcslen(__s) + wcslen(__d) + 1 > __b / sizeof(wchar_t)) |
| 161 | __builtin_trap(); | 134 | __builtin_trap(); |
| @@ -168,7 +141,7 @@ __diagnose_as_builtin(__builtin_wcscpy, 1, 2) | |||
| 168 | _FORTIFY_FN(wcscpy) wchar_t *wcscpy(wchar_t * _FORTIFY_POS0 __d, | 141 | _FORTIFY_FN(wcscpy) wchar_t *wcscpy(wchar_t * _FORTIFY_POS0 __d, |
| 169 | const wchar_t *__s) | 142 | const wchar_t *__s) |
| 170 | { | 143 | { |
| 171 | size_t __b = __bos(__d, 0); | 144 | __fh_size_t __b = __bos(__d, 0); |
| 172 | 145 | ||
| 173 | if (wcslen(__s) + 1 > __b / sizeof(wchar_t)) | 146 | if (wcslen(__s) + 1 > __b / sizeof(wchar_t)) |
| 174 | __builtin_trap(); | 147 | __builtin_trap(); |
| @@ -181,8 +154,8 @@ __diagnose_as_builtin(__builtin_wcsncat, 1, 2, 3) | |||
| 181 | _FORTIFY_FN(wcsncat) wchar_t *wcsncat(wchar_t * _FORTIFY_POS0 __d, | 154 | _FORTIFY_FN(wcsncat) wchar_t *wcsncat(wchar_t * _FORTIFY_POS0 __d, |
| 182 | const wchar_t *__s, size_t __n) | 155 | const wchar_t *__s, size_t __n) |
| 183 | { | 156 | { |
| 184 | size_t __b = __bos(__d, 0); | 157 | __fh_size_t __b = __bos(__d, 0); |
| 185 | size_t __sl, __dl; | 158 | __fh_size_t __sl, __dl; |
| 186 | 159 | ||
| 187 | if (__n > __b / sizeof(wchar_t)) { | 160 | if (__n > __b / sizeof(wchar_t)) { |
| 188 | __sl = wcslen(__s); | 161 | __sl = wcslen(__s); |
| @@ -201,7 +174,7 @@ __diagnose_as_builtin(__builtin_wcsncpy, 1, 2, 3) | |||
| 201 | _FORTIFY_FN(wcsncpy) wchar_t *wcsncpy(wchar_t * _FORTIFY_POS0 __d, | 174 | _FORTIFY_FN(wcsncpy) wchar_t *wcsncpy(wchar_t * _FORTIFY_POS0 __d, |
| 202 | const wchar_t *__s, size_t __n) | 175 | const wchar_t *__s, size_t __n) |
| 203 | { | 176 | { |
| 204 | size_t __b = __bos(__d, 0); | 177 | __fh_size_t __b = __bos(__d, 0); |
| 205 | 178 | ||
| 206 | if (__n > __b / sizeof(wchar_t)) | 179 | if (__n > __b / sizeof(wchar_t)) |
| 207 | __builtin_trap(); | 180 | __builtin_trap(); |
| @@ -218,17 +191,17 @@ _FORTIFY_FN(wcsnrtombs) size_t wcsnrtombs(char * _FORTIFY_POS0 __d, | |||
| 218 | const wchar_t **__s, size_t __wn, | 191 | const wchar_t **__s, size_t __wn, |
| 219 | size_t __n, mbstate_t *__st) | 192 | size_t __n, mbstate_t *__st) |
| 220 | { | 193 | { |
| 221 | size_t __b = __bos(__d, 0); | 194 | __fh_size_t __b = __bos(__d, 0); |
| 222 | size_t __r; | 195 | __fh_size_t __r; |
| 223 | 196 | ||
| 224 | if (__wn > __n / sizeof(wchar_t)) { | 197 | if (__wn > __n / sizeof(wchar_t)) { |
| 225 | __b /= sizeof(wchar_t); | 198 | __b /= sizeof(wchar_t); |
| 226 | __r = __orig_wcsnrtombs(__d, __s, __wn > __b ? __b : __wn, __n, __st); | 199 | __r = __orig_wcsnrtombs(__d, __s, __wn > __b ? __b : __wn, __n, __st); |
| 227 | if (__b < __wn && __d && *__s && __r != (size_t)-1) | 200 | if (__b < __wn && __d && *__s && __r != (__fh_size_t)-1) |
| 228 | __builtin_trap(); | 201 | __builtin_trap(); |
| 229 | } else { | 202 | } else { |
| 230 | __r = __orig_wcsnrtombs(__d, __s, __wn, __n > __b ? __b : __n, __st); | 203 | __r = __orig_wcsnrtombs(__d, __s, __wn, __n > __b ? __b : __n, __st); |
| 231 | if (__b < __n && __d && *__s && __r != (size_t)-1) | 204 | if (__b < __n && __d && *__s && __r != (__fh_size_t)-1) |
| 232 | __builtin_trap(); | 205 | __builtin_trap(); |
| 233 | } | 206 | } |
| 234 | return __r; | 207 | return __r; |
| @@ -242,40 +215,29 @@ _FORTIFY_FN(wcsrtombs) size_t wcsrtombs(char * _FORTIFY_POS0 __d, | |||
| 242 | const wchar_t **__s, size_t __n, | 215 | const wchar_t **__s, size_t __n, |
| 243 | mbstate_t *__st) | 216 | mbstate_t *__st) |
| 244 | { | 217 | { |
| 245 | size_t __b = __bos(__d, 0); | 218 | __fh_size_t __b = __bos(__d, 0); |
| 246 | size_t __r; | 219 | __fh_size_t __r; |
| 247 | 220 | ||
| 248 | __r = __orig_wcsrtombs(__d, __s, __n > __b ? __b : __n, __st); | 221 | __r = __orig_wcsrtombs(__d, __s, __n > __b ? __b : __n, __st); |
| 249 | if (__b < __n && __d && *__s && __r != (size_t)-1) | 222 | if (__b < __n && __d && *__s && __r != (__fh_size_t)-1) |
| 250 | __builtin_trap(); | 223 | __builtin_trap(); |
| 251 | return __r; | 224 | return __r; |
| 252 | } | 225 | } |
| 253 | 226 | ||
| 254 | __access(write_only, 1, 3) | 227 | #ifdef MB_CUR_MAX |
| 255 | #if __has_builtin(__builtin_wcstombs) | 228 | #undef wctomb |
| 256 | __diagnose_as_builtin(__builtin_wcstombs, 1, 2, 3) | ||
| 257 | #endif | ||
| 258 | _FORTIFY_FN(wcstombs) size_t wcstombs(char * _FORTIFY_POS0 __s, | ||
| 259 | const wchar_t *__ws, size_t __n) | ||
| 260 | { | ||
| 261 | size_t __b = __bos(__s, 0); | ||
| 262 | |||
| 263 | if (__s && __n > __b) | ||
| 264 | __builtin_trap(); | ||
| 265 | return __orig_wcstombs(__s, __ws, __n); | ||
| 266 | } | ||
| 267 | |||
| 268 | #if __has_builtin(__builtin_wctomb) | 229 | #if __has_builtin(__builtin_wctomb) |
| 269 | __diagnose_as_builtin(__builtin_wctomb, 1, 2) | 230 | __diagnose_as_builtin(__builtin_wctomb, 1, 2) |
| 270 | #endif | 231 | #endif |
| 271 | _FORTIFY_FN(wctomb) int wctomb(char * _FORTIFY_POS0 __s, wchar_t __w) | 232 | _FORTIFY_FN(wctomb) int wctomb(char * _FORTIFY_POS0 __s, wchar_t __w) |
| 272 | { | 233 | { |
| 273 | size_t __b = __bos(__s, 0); | 234 | __fh_size_t __b = __bos(__s, 0); |
| 274 | 235 | ||
| 275 | if (__s && MB_LEN_MAX > __b && MB_CUR_MAX > __b) | 236 | if (__s && 16 > __b && MB_CUR_MAX > __b) |
| 276 | __builtin_trap(); | 237 | __builtin_trap(); |
| 277 | return __orig_wctomb(__s, __w); | 238 | return __orig_wctomb(__s, __w); |
| 278 | } | 239 | } |
| 240 | #endif // MB_CUR_MAX | ||
| 279 | 241 | ||
| 280 | #if __has_builtin(__builtin_wmemcpy) | 242 | #if __has_builtin(__builtin_wmemcpy) |
| 281 | __diagnose_as_builtin(__builtin_wmemcpy, 1, 2, 3) | 243 | __diagnose_as_builtin(__builtin_wmemcpy, 1, 2, 3) |
| @@ -283,7 +245,7 @@ __diagnose_as_builtin(__builtin_wmemcpy, 1, 2, 3) | |||
| 283 | _FORTIFY_FN(wmemcpy) wchar_t *wmemcpy(wchar_t * _FORTIFY_POS0 __d, | 245 | _FORTIFY_FN(wmemcpy) wchar_t *wmemcpy(wchar_t * _FORTIFY_POS0 __d, |
| 284 | const wchar_t *__s, size_t __n) | 246 | const wchar_t *__s, size_t __n) |
| 285 | { | 247 | { |
| 286 | size_t __b = __bos(__d, 0); | 248 | __fh_size_t __b = __bos(__d, 0); |
| 287 | 249 | ||
| 288 | if (__n > __b / sizeof(wchar_t)) | 250 | if (__n > __b / sizeof(wchar_t)) |
| 289 | __builtin_trap(); | 251 | __builtin_trap(); |
| @@ -296,7 +258,7 @@ __diagnose_as_builtin(__builtin_wmemmove, 1, 2, 3) | |||
| 296 | _FORTIFY_FN(wmemmove) wchar_t *wmemmove(wchar_t * _FORTIFY_POS0 __d, | 258 | _FORTIFY_FN(wmemmove) wchar_t *wmemmove(wchar_t * _FORTIFY_POS0 __d, |
| 297 | const wchar_t *__s, size_t __n) | 259 | const wchar_t *__s, size_t __n) |
| 298 | { | 260 | { |
| 299 | size_t __b = __bos(__d, 0); | 261 | __fh_size_t __b = __bos(__d, 0); |
| 300 | 262 | ||
| 301 | if (__n > __b / sizeof(wchar_t)) | 263 | if (__n > __b / sizeof(wchar_t)) |
| 302 | __builtin_trap(); | 264 | __builtin_trap(); |
| @@ -309,7 +271,7 @@ __diagnose_as_builtin(__builtin_wmemset, 1, 2, 3) | |||
| 309 | _FORTIFY_FN(wmemset) wchar_t *wmemset(wchar_t * _FORTIFY_POS0 __s, | 271 | _FORTIFY_FN(wmemset) wchar_t *wmemset(wchar_t * _FORTIFY_POS0 __s, |
| 310 | wchar_t __c, size_t __n) | 272 | wchar_t __c, size_t __n) |
| 311 | { | 273 | { |
| 312 | size_t __b = __bos(__s, 0); | 274 | __fh_size_t __b = __bos(__s, 0); |
| 313 | 275 | ||
| 314 | if (__n > __b / sizeof(wchar_t)) | 276 | if (__n > __b / sizeof(wchar_t)) |
| 315 | __builtin_trap(); | 277 | __builtin_trap(); |
