wchar.h (7241B)
1 /* 2 * Copyright (C) 2015-2017 Dimitris Papastamos <sin@2f30.org> 3 * Copyright (C) 2022 q66 <q66@chimera-linux.org> 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #ifndef _FORTIFY_WCHAR_H 18 #define _FORTIFY_WCHAR_H 19 20 #if !defined(__cplusplus) && !defined(__clang__) 21 __extension__ 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> 36 37 #if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0 38 #include "fortify-headers.h" 39 40 #ifdef __cplusplus 41 extern "C" { 42 #endif 43 44 #undef fgetws 45 #undef mbsrtowcs 46 #undef mbstowcs 47 #undef wcrtomb 48 #undef wcscat 49 #undef wcscpy 50 #undef wcsncat 51 #undef wcsncpy 52 #undef wcsrtombs 53 #undef wcstombs 54 #undef wmemcpy 55 #undef wmemmove 56 #undef wmemset 57 58 _FORTIFY_FN(fgetws) wchar_t *fgetws(wchar_t * _FORTIFY_POS0 __s, 59 int __n, FILE *__f) 60 { 61 size_t __b = __bos(__s, 0); 62 63 if ((size_t)__n > __b / sizeof(wchar_t)) 64 __builtin_trap(); 65 return __orig_fgetws(__s, __n, __f); 66 } 67 68 #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \ 69 || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) 70 #undef mbsnrtowcs 71 _FORTIFY_FN(mbsnrtowcs) size_t mbsnrtowcs(wchar_t * _FORTIFY_POS0 __d, 72 const char **__s, size_t __n, 73 size_t __wn, mbstate_t *__st) 74 { 75 size_t __b = __bos(__d, 0); 76 size_t __r; 77 78 if (__wn > __n / sizeof(wchar_t)) { 79 __b /= sizeof(wchar_t); 80 __r = __orig_mbsnrtowcs(__d, __s, __n, __wn > __b ? __b : __wn, __st); 81 if (__b < __wn && __d && *__s && __r != (size_t)-1) 82 __builtin_trap(); 83 } else { 84 __r = __orig_mbsnrtowcs(__d, __s, __n > __b ? __b : __n, __wn, __st); 85 if (__b < __n && __d && *__s && __r != (size_t)-1) 86 __builtin_trap(); 87 } 88 return __r; 89 } 90 #endif 91 92 _FORTIFY_FN(mbsrtowcs) size_t mbsrtowcs(wchar_t * _FORTIFY_POS0 __d, 93 const char **__s, size_t __wn, 94 mbstate_t *__st) 95 { 96 size_t __b = __bos(__d, 0); 97 size_t __r; 98 99 __b /= sizeof(wchar_t); 100 __r = __orig_mbsrtowcs(__d, __s, __wn > __b ? __b : __wn, __st); 101 if (__b < __wn && __d && *__s && __r != (size_t)-1) 102 __builtin_trap(); 103 return __r; 104 } 105 106 _FORTIFY_FN(mbstowcs) size_t mbstowcs(wchar_t * _FORTIFY_POS0 __ws, 107 const char *__s, size_t __wn) 108 { 109 size_t __b = __bos(__ws, 0); 110 111 if (__ws && __wn > __b / sizeof(wchar_t)) 112 __builtin_trap(); 113 return __orig_mbstowcs(__ws, __s, __wn); 114 } 115 116 /* FIXME clang */ 117 #ifndef __clang__ 118 _FORTIFY_FN(wcrtomb) size_t wcrtomb(char * __s, wchar_t __w, mbstate_t *__st) 119 { 120 if (__s && MB_LEN_MAX > __bos(__s, 2)) { 121 char __buf[MB_LEN_MAX]; 122 size_t __r; 123 124 __r = __orig_wcrtomb(__buf, __w, __st); 125 if (__r == (size_t)-1) 126 return __r; 127 if (__r > __bos(__s, 0)) 128 __builtin_trap(); 129 __builtin_memcpy(__s, __buf, __r); 130 return __r; 131 } 132 return __orig_wcrtomb(__s, __w, __st); 133 } 134 #endif 135 136 _FORTIFY_FN(wcscat) wchar_t *wcscat(wchar_t * _FORTIFY_POS0 __d, 137 const wchar_t *__s) 138 { 139 size_t __b = __bos(__d, 0); 140 141 if (wcslen(__s) + wcslen(__d) + 1 > __b / sizeof(wchar_t)) 142 __builtin_trap(); 143 return __orig_wcscat(__d, __s); 144 } 145 146 _FORTIFY_FN(wcscpy) wchar_t *wcscpy(wchar_t * _FORTIFY_POS0 __d, 147 const wchar_t *__s) 148 { 149 size_t __b = __bos(__d, 0); 150 151 if (wcslen(__s) + 1 > __b / sizeof(wchar_t)) 152 __builtin_trap(); 153 return __orig_wcscpy(__d, __s); 154 } 155 156 _FORTIFY_FN(wcsncat) wchar_t *wcsncat(wchar_t * _FORTIFY_POS0 __d, 157 const wchar_t *__s, size_t __n) 158 { 159 size_t __b = __bos(__d, 0); 160 size_t __sl, __dl; 161 162 if (__n > __b / sizeof(wchar_t)) { 163 __sl = wcslen(__s); 164 __dl = wcslen(__d); 165 if (__sl > __n) 166 __sl = __n; 167 if (__sl + __dl + 1 > __b / sizeof(wchar_t)) 168 __builtin_trap(); 169 } 170 return __orig_wcsncat(__d, __s, __n); 171 } 172 173 _FORTIFY_FN(wcsncpy) wchar_t *wcsncpy(wchar_t * _FORTIFY_POS0 __d, 174 const wchar_t *__s, size_t __n) 175 { 176 size_t __b = __bos(__d, 0); 177 178 if (__n > __b / sizeof(wchar_t)) 179 __builtin_trap(); 180 return __orig_wcsncpy(__d, __s, __n); 181 } 182 183 #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \ 184 || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) 185 #undef wcsnrtombs 186 _FORTIFY_FN(wcsnrtombs) size_t wcsnrtombs(char * _FORTIFY_POS0 __d, 187 const wchar_t **__s, size_t __wn, 188 size_t __n, mbstate_t *__st) 189 { 190 size_t __b = __bos(__d, 0); 191 size_t __r; 192 193 if (__wn > __n / sizeof(wchar_t)) { 194 __b /= sizeof(wchar_t); 195 __r = __orig_wcsnrtombs(__d, __s, __wn > __b ? __b : __wn, __n, __st); 196 if (__b < __wn && __d && *__s && __r != (size_t)-1) 197 __builtin_trap(); 198 } else { 199 __r = __orig_wcsnrtombs(__d, __s, __wn, __n > __b ? __b : __n, __st); 200 if (__b < __n && __d && *__s && __r != (size_t)-1) 201 __builtin_trap(); 202 } 203 return __r; 204 } 205 #endif 206 207 _FORTIFY_FN(wcsrtombs) size_t wcsrtombs(char * _FORTIFY_POS0 __d, 208 const wchar_t **__s, size_t __n, 209 mbstate_t *__st) 210 { 211 size_t __b = __bos(__d, 0); 212 size_t __r; 213 214 __r = __orig_wcsrtombs(__d, __s, __n > __b ? __b : __n, __st); 215 if (__b < __n && __d && *__s && __r != (size_t)-1) 216 __builtin_trap(); 217 return __r; 218 } 219 220 _FORTIFY_FN(wcstombs) size_t wcstombs(char * _FORTIFY_POS0 __s, 221 const wchar_t *__ws, size_t __n) 222 { 223 size_t __b = __bos(__s, 0); 224 225 if (__s && __n > __b) 226 __builtin_trap(); 227 return __orig_wcstombs(__s, __ws, __n); 228 } 229 230 _FORTIFY_FN(wmemcpy) wchar_t *wmemcpy(wchar_t * _FORTIFY_POS0 __d, 231 const wchar_t *__s, size_t __n) 232 { 233 size_t __b = __bos(__d, 0); 234 235 if (__n > __b / sizeof(wchar_t)) 236 __builtin_trap(); 237 return __orig_wmemcpy(__d, __s, __n); 238 } 239 240 _FORTIFY_FN(wmemmove) wchar_t *wmemmove(wchar_t * _FORTIFY_POS0 __d, 241 const wchar_t *__s, size_t __n) 242 { 243 size_t __b = __bos(__d, 0); 244 245 if (__n > __b / sizeof(wchar_t)) 246 __builtin_trap(); 247 return __orig_wmemmove(__d, __s, __n); 248 } 249 250 _FORTIFY_FN(wmemset) wchar_t *wmemset(wchar_t * _FORTIFY_POS0 __s, 251 wchar_t __c, size_t __n) 252 { 253 size_t __b = __bos(__s, 0); 254 255 if (__n > __b / sizeof(wchar_t)) 256 __builtin_trap(); 257 return __orig_wmemset(__s, __c, __n); 258 } 259 260 #ifdef __cplusplus 261 } 262 #endif 263 264 #endif 265 266 #endif