#define _GNU_SOURCE #include #include #include #include #define mbstowcs real_mbstowcs #define mbrtowc real_mbrtowc #include #include #undef mbstowcs #undef mbrtowc #include size_t mbstowcs(wchar_t *dest, const char *src, size_t n) { static size_t (*real)(wchar_t *, const char *, size_t); size_t ret; if (!real) real = dlsym(RTLD_NEXT, "mbstowcs"); assert(real); ret = real(dest, src, n); if (!dest || ret < 0) return ret; for (; *dest; dest++) { if (*dest < 0 || *dest > 0x10ffff) return -1; } return ret; } size_t mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) { static size_t (*real)(wchar_t *, const char *, size_t, mbstate_t *); wchar_t out; size_t ret; if (!real) real = dlsym(RTLD_NEXT, "mbrtowc"); assert(real); ret = real(&out, s, n, ps); if (ret < 0) return ret; if (out < 0 || out > 0x10ffff) { errno = EILSEQ; return -1; } if (pwc) *pwc = out; return ret; }