blob: a206de3bdc3f7fb8906fff1afe6102a29edcdab9 [file] [log] [blame]
Kai Tietz890873a2012-08-07 13:48:09 +00001#include <windows.h>
2#include <malloc.h>
3#include <errno.h>
Jacek Cabana5c387c2013-06-17 13:12:21 +00004#include <msvcrt.h>
Kai Tietz890873a2012-08-07 13:48:09 +00005
Kai Tietz890873a2012-08-07 13:48:09 +00006static errno_t __cdecl _int_memcpy_s (void *, size_t, const void *, size_t);
7static errno_t __cdecl _stub (void *, size_t, const void *, size_t);
8
9errno_t __cdecl (*__MINGW_IMP_SYMBOL(memcpy_s))(void *, size_t, const void *, size_t) =
10 _stub;
11
12static errno_t __cdecl
13_stub (void *d, size_t dn, const void *s, size_t n)
14{
15 errno_t __cdecl (*f)(void *, size_t, const void *, size_t) = __MINGW_IMP_SYMBOL(memcpy_s);
16
17 if (f == _stub)
18 {
Martin Storsjöf4f972f2024-09-18 15:05:06 +030019 f = (void*)
Kai Tietz890873a2012-08-07 13:48:09 +000020 GetProcAddress (__mingw_get_msvcrt_handle (), "memcpy_s");
21 if (!f)
22 f = _int_memcpy_s;
23 __MINGW_IMP_SYMBOL(memcpy_s) = f;
24 }
25 return (*f)(d, dn, s, n);
26}
27
28errno_t __cdecl
29memcpy_s (void *d, size_t dn, const void *s, size_t n)
30{
31 return _stub (d, dn, s, n);
32}
33
34static errno_t __cdecl
35_int_memcpy_s (void *d, size_t dn, const void *s, size_t n)
36{
37 if (!n)
38 return 0;
39
40 if (!d || !s)
41 {
42 if (d)
43 memset (d, 0, dn);
44 errno = EINVAL;
45 return EINVAL;
46 }
47
48 if (dn < n)
49 {
50 memset (d, 0, dn);
51
52 errno = ERANGE;
53 return ERANGE;
54 }
55
56 memcpy (d, s, n);
57
58 return 0;
59}