Index: include/crt/string.h =================================================================== --- include/crt/string.h (revision 69810) +++ include/crt/string.h (working copy) @@ -1057,6 +1057,24 @@ _In_ size_t _Size, _In_opt_ _locale_t _Locale); + _CRTIMP + errno_t + __cdecl + memcpy_s(_Out_writes_bytes_to_opt_(_DstSize, _MaxCount) void * _Dst, + _In_ size_t _DstSize, + _In_reads_bytes_opt_(_MaxCount) const void * _Src, + _In_ size_t _MaxCount); + + _Check_return_wat_ + _CRTIMP + errno_t + __cdecl + memmove_s( + _Out_writes_bytes_to_opt_(_DstSize, _MaxCount) void * _Dst, + _In_ size_t _DstSize, + _In_reads_bytes_opt_(_MaxCount) const void * _Src, + _In_ size_t _MaxCount); + #endif /* __STDC_WANT_SECURE_LIB__ */ #ifndef NO_OLDNAMES Index: lib/sdk/crt/mem/memcpy.c =================================================================== --- lib/sdk/crt/mem/memcpy.c (revision 69810) +++ lib/sdk/crt/mem/memcpy.c (working copy) @@ -38,3 +38,47 @@ return dest; } + +int CDECL MSVCRT_memcpy_s(void *dest, MSVCRT_size_t numberOfElements, const void *src, MSVCRT_size_t count) +{ + if (!count) + return 0; + + if (!MSVCRT_CHECK_PMT(dest != NULL)) return MSVCRT_EINVAL; + if (!MSVCRT_CHECK_PMT(src != NULL)) + { + memset(dest, 0, numberOfElements); + return MSVCRT_EINVAL; + } + if (!MSVCRT_CHECK_PMT_ERR(count <= numberOfElements, MSVCRT_ERANGE)) + { + memset(dest, 0, numberOfElements); + return MSVCRT_ERANGE; + } + + memcpy(dest, src, count); + return 0; +} + +int CDECL wmemcpy_s(MSVCRT_wchar_t *dest, MSVCRT_size_t numberOfElements, + const MSVCRT_wchar_t *src, MSVCRT_size_t count) +{ + if (!count) + return 0; + + if (!MSVCRT_CHECK_PMT(dest != NULL)) return MSVCRT_EINVAL; + + if (!MSVCRT_CHECK_PMT(src != NULL)) + { + memset(dest, 0, numberOfElements*sizeof(MSVCRT_wchar_t)); + return MSVCRT_EINVAL; + } + if (!MSVCRT_CHECK_PMT_ERR(count <= numberOfElements, MSVCRT_ERANGE)) + { + memset(dest, 0, numberOfElements*sizeof(MSVCRT_wchar_t)); + return MSVCRT_ERANGE; + } + + memcpy(dest, src, sizeof(MSVCRT_wchar_t)*count); + return 0; +} \ No newline at end of file Index: lib/sdk/crt/mem/memmove.c =================================================================== --- lib/sdk/crt/mem/memmove.c (revision 69810) +++ lib/sdk/crt/mem/memmove.c (working copy) @@ -34,3 +34,36 @@ return dest; } + +//int CDECL memmove_s(void *dest, size_t numberOfElements, const void *, size_t count) +_Check_return_wat_ _CRTIMP errno_t __cdecl +memmove_s(_Out_writes_bytes_to_opt_(numberOfElements, _MaxCount) void * dest, _In_ rsize_t numberOfElements, _In_reads_bytes_opt_(count) const void * src, _In_ rsize_t count); +{ + if (!count) + return 0; + + if (!MSVCRT_CHECK_PMT(dest != NULL)) return MSVCRT_EINVAL; + if (!MSVCRT_CHECK_PMT(src != NULL)) return MSVCRT_EINVAL; + if (!MSVCRT_CHECK_PMT_ERR(count <= numberOfElements, MSVCRT_ERANGE)) return MSVCRT_ERANGE; + + memmove(dest, src, count); + return 0; +} + +int CDECL wmemmove_s(MSVCRT_wchar_t *dest, MSVCRT_size_t numberOfElements, + const MSVCRT_wchar_t *src, MSVCRT_size_t count) +{ + if (!count) + return 0; + + /* Native does not seem to conform to 6.7.1.2.3 in + * http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1225.pdf + * in that it does not zero the output buffer on constraint violation. + */ + if (!MSVCRT_CHECK_PMT(dest != NULL)) return MSVCRT_EINVAL; + if (!MSVCRT_CHECK_PMT(src != NULL)) return MSVCRT_EINVAL; + if (!MSVCRT_CHECK_PMT_ERR(count <= numberOfElements, MSVCRT_ERANGE)) return MSVCRT_ERANGE; + + memmove(dest, src, sizeof(MSVCRT_wchar_t)*count); + return 0; +} \ No newline at end of file