wchar.h (7005B)
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 __b /= sizeof(wchar_t); 79 __r = __orig_mbsnrtowcs(__d, __s, __n, __wn > __b ? __b : __wn, __st); 80 if (__b < __wn && __d && *__s && __r != (size_t)-1) 81 __builtin_trap(); 82 return __r; 83 } 84 #endif 85 86 _FORTIFY_FN(mbsrtowcs) size_t mbsrtowcs(wchar_t * _FORTIFY_POS0 __d, 87 const char **__s, size_t __wn, 88 mbstate_t *__st) 89 { 90 size_t __b = __bos(__d, 0); 91 size_t __r; 92 93 __b /= sizeof(wchar_t); 94 __r = __orig_mbsrtowcs(__d, __s, __wn > __b ? __b : __wn, __st); 95 if (__b < __wn && __d && *__s && __r != (size_t)-1) 96 __builtin_trap(); 97 return __r; 98 } 99 100 _FORTIFY_FN(mbstowcs) size_t mbstowcs(wchar_t * _FORTIFY_POS0 __ws, 101 const char *__s, size_t __wn) 102 { 103 size_t __b = __bos(__ws, 0); 104 105 if (__ws && __wn > __b / sizeof(wchar_t)) 106 __builtin_trap(); 107 return __orig_mbstowcs(__ws, __s, __wn); 108 } 109 110 /* FIXME clang */ 111 #ifndef __clang__ 112 _FORTIFY_FN(wcrtomb) size_t wcrtomb(char * __s, wchar_t __w, mbstate_t *__st) 113 { 114 if (__s && MB_LEN_MAX > __bos(__s, 2)) { 115 char __buf[MB_LEN_MAX]; 116 size_t __r; 117 118 __r = __orig_wcrtomb(__buf, __w, __st); 119 if (__r == (size_t)-1) 120 return __r; 121 if (__r > __bos(__s, 0)) 122 __builtin_trap(); 123 __builtin_memcpy(__s, __buf, __r); 124 return __r; 125 } 126 return __orig_wcrtomb(__s, __w, __st); 127 } 128 #endif 129 130 _FORTIFY_FN(wcscat) wchar_t *wcscat(wchar_t * _FORTIFY_POS0 __d, 131 const wchar_t *__s) 132 { 133 size_t __b = __bos(__d, 0); 134 135 if (wcslen(__s) + wcslen(__d) + 1 > __b / sizeof(wchar_t)) 136 __builtin_trap(); 137 return __orig_wcscat(__d, __s); 138 } 139 140 _FORTIFY_FN(wcscpy) wchar_t *wcscpy(wchar_t * _FORTIFY_POS0 __d, 141 const wchar_t *__s) 142 { 143 size_t __b = __bos(__d, 0); 144 145 if (wcslen(__s) + 1 > __b / sizeof(wchar_t)) 146 __builtin_trap(); 147 return __orig_wcscpy(__d, __s); 148 } 149 150 _FORTIFY_FN(wcsncat) wchar_t *wcsncat(wchar_t * _FORTIFY_POS0 __d, 151 const wchar_t *__s, size_t __n) 152 { 153 size_t __b = __bos(__d, 0); 154 size_t __sl, __dl; 155 156 __sl = wcslen(__s); 157 __dl = wcslen(__d); 158 if (__sl > __n) 159 __sl = __n; 160 if (__sl + __dl + 1 > __b / sizeof(wchar_t)) 161 __builtin_trap(); 162 return __orig_wcsncat(__d, __s, __n); 163 } 164 165 _FORTIFY_FN(wcsncpy) wchar_t *wcsncpy(wchar_t * _FORTIFY_POS0 __d, 166 const wchar_t *__s, size_t __n) 167 { 168 size_t __b = __bos(__d, 0); 169 170 if (__n > __b / sizeof(wchar_t)) 171 __builtin_trap(); 172 return __orig_wcsncpy(__d, __s, __n); 173 } 174 175 #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \ 176 || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) 177 #undef wcsnrtombs 178 _FORTIFY_FN(wcsnrtombs) size_t wcsnrtombs(char * _FORTIFY_POS0 __d, 179 const wchar_t **__s, size_t __wn, 180 size_t __n, mbstate_t *__st) 181 { 182 size_t __b = __bos(__d, 0); 183 size_t __r; 184 185 __r = __orig_wcsnrtombs(__d, __s, __wn, __n > __b ? __b : __n, __st); 186 if (__b < __n && __d && *__s && __r != (size_t)-1) 187 __builtin_trap(); 188 return __r; 189 } 190 #endif 191 192 _FORTIFY_FN(wcsrtombs) size_t wcsrtombs(char * _FORTIFY_POS0 __d, 193 const wchar_t **__s, size_t __n, 194 mbstate_t *__st) 195 { 196 size_t __b = __bos(__d, 0); 197 size_t __r; 198 199 __r = __orig_wcsrtombs(__d, __s, __n > __b ? __b : __n, __st); 200 if (__b < __n && __d && *__s && __r != (size_t)-1) 201 __builtin_trap(); 202 return __r; 203 } 204 205 _FORTIFY_FN(wcstombs) size_t wcstombs(char * _FORTIFY_POS0 __s, 206 const wchar_t *__ws, size_t __n) 207 { 208 size_t __b = __bos(__s, 0); 209 210 if (__s && __n > __b) 211 __builtin_trap(); 212 return __orig_wcstombs(__s, __ws, __n); 213 } 214 215 _FORTIFY_FN(wmemcpy) wchar_t *wmemcpy(wchar_t * _FORTIFY_POS0 __d, 216 const wchar_t * _FORTIFY_POS0 __s, 217 size_t __n) 218 { 219 size_t __bd = __bos(__d, 0); 220 size_t __bs = __bos(__s, 0); 221 222 if (__n > __bd / sizeof(wchar_t) || __n > __bs / sizeof(wchar_t)) 223 __builtin_trap(); 224 return __orig_wmemcpy(__d, __s, __n); 225 } 226 227 _FORTIFY_FN(wmemmove) wchar_t *wmemmove(wchar_t * _FORTIFY_POS0 __d, 228 const wchar_t * _FORTIFY_POS0 __s, 229 size_t __n) 230 { 231 size_t __bd = __bos(__d, 0); 232 size_t __bs = __bos(__s, 0); 233 234 if (__n > __bd / sizeof(wchar_t) || __n > __bs / sizeof(wchar_t)) 235 __builtin_trap(); 236 return __orig_wmemmove(__d, __s, __n); 237 } 238 239 _FORTIFY_FN(wmemset) wchar_t *wmemset(wchar_t * _FORTIFY_POS0 __s, 240 wchar_t __c, size_t __n) 241 { 242 size_t __b = __bos(__s, 0); 243 244 if (__n > __b / sizeof(wchar_t)) 245 __builtin_trap(); 246 return __orig_wmemset(__s, __c, __n); 247 } 248 249 #ifdef __cplusplus 250 } 251 #endif 252 253 #endif 254 255 #endif