fortify-headers

standalone fortify-source implementation
git clone git://git.2f30.org/fortify-headers
Log | Files | Refs | README | LICENSE

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