Add secapi wrapper for wmemmove_s wmemmove_s implementation for msvcrt.
diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am index 7ce2bd2..1077cd3 100644 --- a/mingw-w64-crt/Makefile.am +++ b/mingw-w64-crt/Makefile.am
@@ -191,7 +191,8 @@ secapi/sprintf_s.c \ secapi/strerror_s.c \ secapi/vsprintf_s.c \ - secapi/wmemcpy_s.c + secapi/wmemcpy_s.c \ + secapi/wmemmove_s.c src_msvcrt32=\ $(src_msvcrt) \
diff --git a/mingw-w64-crt/secapi/wmemmove_s.c b/mingw-w64-crt/secapi/wmemmove_s.c new file mode 100644 index 0000000..c15f50b --- /dev/null +++ b/mingw-w64-crt/secapi/wmemmove_s.c
@@ -0,0 +1,60 @@ +#include <windows.h> +#include <malloc.h> +#include <errno.h> +#include <msvcrt.h> + +errno_t __cdecl wmemmove_s (wchar_t *, size_t, const wchar_t *, size_t); +static errno_t __cdecl _int_wmemmove_s (wchar_t *, size_t, const wchar_t*, size_t); +static errno_t __cdecl _stub (wchar_t *, size_t, const wchar_t *, size_t); + +errno_t __cdecl (*__MINGW_IMP_SYMBOL(wmemmove_s))(wchar_t *, size_t, const wchar_t *, size_t) = + _stub; + +static errno_t __cdecl +_stub (wchar_t *d, size_t dn, const wchar_t *s, size_t n) +{ + errno_t __cdecl (*f)(wchar_t *, size_t, const wchar_t *, size_t) = __MINGW_IMP_SYMBOL(wmemmove_s); + + if (f == _stub) + { + f = (errno_t __cdecl (*)(wchar_t *, size_t, const wchar_t *, size_t)) + GetProcAddress (__mingw_get_msvcrt_handle (), "wmemmove_s"); + if (!f) + f = _int_wmemmove_s; + __MINGW_IMP_SYMBOL(wmemmove_s) = f; + } + return (*f)(d, dn, s, n); +} + +errno_t __cdecl +wmemmove_s (wchar_t *d, size_t dn, const wchar_t *s, size_t n) +{ + return _stub (d, dn, s, n); +} + +static errno_t __cdecl +_int_wmemmove_s (wchar_t *d, size_t dn, const wchar_t *s, size_t n) +{ + if (!n) + return 0; + + if (!d || !s) + { + if (d) + memset (d, 0, dn * sizeof (wchar_t)); + errno = EINVAL; + return EINVAL; + } + + if (dn < n) + { + memset (d, 0, dn * sizeof (wchar_t)); + + errno = ERANGE; + return ERANGE; + } + + memmove (d, s, n * sizeof (wchar_t)); + + return 0; +}