fortify-headers

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

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