| 1 | #ifndef _SSP_WCHAR_H_ |
|---|
| 2 | #define _SSP_WCHAR_H_ |
|---|
| 3 | |
|---|
| 4 | #include <sys/cdefs.h> |
|---|
| 5 | #include <ssp/ssp.h> |
|---|
| 6 | |
|---|
| 7 | #if __SSP_FORTIFY_LEVEL > 0 |
|---|
| 8 | |
|---|
| 9 | /* wide character variant, __wlen is number of wchar_t */ |
|---|
| 10 | #define __ssp_redirect_wc(rtype, fun, args, call, cond, bos) \ |
|---|
| 11 | __ssp_decl(rtype, fun, args) \ |
|---|
| 12 | { \ |
|---|
| 13 | if (cond) \ |
|---|
| 14 | __ssp_check(__buf, __wlen * sizeof(wchar_t), bos); \ |
|---|
| 15 | return __ssp_real_(fun) call; \ |
|---|
| 16 | } |
|---|
| 17 | |
|---|
| 18 | #define __ssp_bos_wicheck3(fun) \ |
|---|
| 19 | __ssp_redirect_wc(wchar_t *, fun, \ |
|---|
| 20 | (wchar_t *__buf, const wchar_t *__src, size_t __wlen), \ |
|---|
| 21 | (__buf, __src, __wlen), 1, __ssp_bos0) |
|---|
| 22 | |
|---|
| 23 | #define __ssp_bos_wicheck3_restrict(fun) \ |
|---|
| 24 | __ssp_redirect_wc(wchar_t *, fun, \ |
|---|
| 25 | (wchar_t *__restrict __buf, const wchar_t *__restrict __src, size_t __wlen), \ |
|---|
| 26 | (__buf, __src, __wlen), 1, __ssp_bos0) |
|---|
| 27 | |
|---|
| 28 | #define __ssp_bos_wicheck2_restrict(fun) \ |
|---|
| 29 | __ssp_decl(wchar_t *, fun, (wchar_t *__restrict __buf, const wchar_t *__restrict __src)) \ |
|---|
| 30 | { \ |
|---|
| 31 | __ssp_check(__buf, (wcslen(__src) + 1) * sizeof(wchar_t), __ssp_bos0); \ |
|---|
| 32 | return __ssp_real_(fun) (__buf, __src); \ |
|---|
| 33 | } |
|---|
| 34 | |
|---|
| 35 | __BEGIN_DECLS |
|---|
| 36 | #if __POSIX_VISIBLE >= 200809 |
|---|
| 37 | __ssp_bos_wicheck2_restrict(wcpcpy) |
|---|
| 38 | __ssp_bos_wicheck3_restrict(wcpncpy) |
|---|
| 39 | #endif |
|---|
| 40 | __ssp_bos_wicheck2_restrict(wcscpy) |
|---|
| 41 | __ssp_bos_wicheck2_restrict(wcscat) |
|---|
| 42 | __ssp_bos_wicheck3_restrict(wcsncpy) |
|---|
| 43 | __ssp_bos_wicheck3_restrict(wcsncat) |
|---|
| 44 | __ssp_bos_wicheck3_restrict(wmemcpy) |
|---|
| 45 | __ssp_bos_wicheck3(wmemmove) |
|---|
| 46 | #if __GNU_VISIBLE |
|---|
| 47 | __ssp_bos_wicheck3_restrict(wmempcpy) |
|---|
| 48 | #endif |
|---|
| 49 | __ssp_redirect_wc(wchar_t *, wmemset, \ |
|---|
| 50 | (wchar_t *__buf, wchar_t __src, size_t __wlen), \ |
|---|
| 51 | (__buf, __src, __wlen), 1, __ssp_bos0) |
|---|
| 52 | |
|---|
| 53 | __ssp_decl(size_t, wcrtomb, (char *__buf, wchar_t __src, mbstate_t *__ps)) |
|---|
| 54 | { |
|---|
| 55 | if (__buf != NULL && __src != L'\0') |
|---|
| 56 | __ssp_check(__buf, sizeof(wchar_t), __ssp_bos); |
|---|
| 57 | return __ssp_real_wcrtomb (__buf, __src, __ps); |
|---|
| 58 | } |
|---|
| 59 | |
|---|
| 60 | __ssp_redirect_wc(size_t, mbsrtowcs, \ |
|---|
| 61 | (wchar_t *__buf, const char **__src, size_t __wlen, mbstate_t *__ps), \ |
|---|
| 62 | (__buf, __src, __wlen, __ps), __buf != NULL, __ssp_bos) |
|---|
| 63 | |
|---|
| 64 | __ssp_redirect_raw(size_t, wcsrtombs, \ |
|---|
| 65 | (char *__buf, const wchar_t **__src, size_t __len, mbstate_t *__ps), \ |
|---|
| 66 | (__buf, __src, __len, __ps), __buf != NULL, __ssp_bos) |
|---|
| 67 | |
|---|
| 68 | #if __POSIX_VISIBLE >= 200809 |
|---|
| 69 | __ssp_redirect_wc(size_t, mbsnrtowcs, \ |
|---|
| 70 | (wchar_t *__buf, const char **__src, size_t __nms, size_t __wlen, mbstate_t *__ps), \ |
|---|
| 71 | (__buf, __src, __nms, __wlen, __ps), __buf != NULL, __ssp_bos) |
|---|
| 72 | |
|---|
| 73 | __ssp_redirect_raw(size_t, wcsnrtombs, \ |
|---|
| 74 | (char *__buf, const wchar_t **__src, size_t __nwc, size_t __len, mbstate_t *__ps), \ |
|---|
| 75 | (__buf, __src, __nwc, __len, __ps), __buf != NULL, __ssp_bos) |
|---|
| 76 | #endif |
|---|
| 77 | |
|---|
| 78 | __ssp_decl(wchar_t *, fgetws, (wchar_t *__restrict __buf, int __wlen, FILE *__restrict __fp)) |
|---|
| 79 | { |
|---|
| 80 | if (__wlen > 0) |
|---|
| 81 | __ssp_check(__buf, (size_t)__wlen * sizeof(wchar_t) , __ssp_bos); |
|---|
| 82 | return __ssp_real_fgetws(__buf, __wlen, __fp); |
|---|
| 83 | } |
|---|
| 84 | |
|---|
| 85 | #if __GNU_VISIBLE |
|---|
| 86 | __ssp_decl(wchar_t *, fgetws_unlocked, (wchar_t *__buf, int __wlen, FILE *__fp)) |
|---|
| 87 | { |
|---|
| 88 | if (__wlen > 0) |
|---|
| 89 | __ssp_check(__buf, (size_t)__wlen * sizeof(wchar_t) , __ssp_bos); |
|---|
| 90 | return __ssp_real_fgetws_unlocked(__buf, __wlen, __fp); |
|---|
| 91 | } |
|---|
| 92 | #endif /* __GNU_VISIBLE */ |
|---|
| 93 | |
|---|
| 94 | __END_DECLS |
|---|
| 95 | |
|---|
| 96 | #endif /* __SSP_FORTIFY_LEVEL > 0 */ |
|---|
| 97 | #endif /* _SSP_WCHAR_H_ */ |
|---|