---
mingw-w64-crt/Makefile.am | 2 +
mingw-w64-crt/lib-common/msvcrt.def.in | 2 +-
mingw-w64-crt/secapi/getenv_s.c | 61 ++++++++++++++++++++++++++
3 files changed, 64 insertions(+), 1 deletion(-)
create mode 100644 mingw-w64-crt/secapi/getenv_s.c
diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index e5ca242db7d7..15233882b4ad 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -385,6 +385,7 @@ src_msvcrt_add_x86=\
secapi/_wstrdate_s.c \
secapi/_wstrtime_s.c \
secapi/asctime_s.c \
+ secapi/getenv_s.c \
secapi/memcpy_s.c \
secapi/memmove_s.c \
secapi/rand_s.c \
@@ -869,6 +870,7 @@ src_pre_msvcr80=\
misc/wcrtomb.c \
misc/wcsnlen.c \
misc/wctob.c \
+ secapi/getenv_s.c \
stdio/_fseeki64.c \
stdio/_fstat64i32.c \
stdio/_ftelli64.c \
diff --git a/mingw-w64-crt/lib-common/msvcrt.def.in
b/mingw-w64-crt/lib-common/msvcrt.def.in
index ab7eeed49ce7..0de1bf54b2d0 100644
--- a/mingw-w64-crt/lib-common/msvcrt.def.in
+++ b/mingw-w64-crt/lib-common/msvcrt.def.in
@@ -1803,7 +1803,7 @@ freopen_s
fscanf_s
fwprintf_s
fwscanf_s
-getenv_s
+F_ARM_ANY(getenv_s) ; i386 and x64 getenv_s replaced by emu
F_ARM_ANY(mbrlen) ; i386 and x64 mbrlen replaced by emu
F_ARM_ANY(mbrtowc) ; i386 and x64 mbrtowc replaced by emu
mbsdup_dbg
diff --git a/mingw-w64-crt/secapi/getenv_s.c b/mingw-w64-crt/secapi/getenv_s.c
new file mode 100644
index 000000000000..b2731830df98
--- /dev/null
+++ b/mingw-w64-crt/secapi/getenv_s.c
@@ -0,0 +1,61 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+static errno_t __cdecl emu_getenv_s(size_t *pReturnValue, char *dstBuf,
rsize_t dstSize, const char *varName)
+{
+ const char *value;
+ size_t size;
+
+ /* Only below parameter validation sets errno to EINVAL. */
+
+ if (!pReturnValue)
+ return errno = EINVAL;
+
+ if ((!dstBuf && dstSize > 0) || (dstBuf && !dstSize)) {
+ *pReturnValue = 0;
+ return errno = EINVAL;
+ }
+
+ if (!varName) {
+ *pReturnValue = 0;
+ if (dstBuf)
+ dstBuf[0] = '\0';
+ return errno = EINVAL;
+ }
+
+ /* After passing parameter validation, the errno is not changed. */
+
+ value = getenv(varName);
+ if (!value) {
+ *pReturnValue = 0;
+ if (dstBuf)
+ dstBuf[0] = '\0';
+ return 0;
+ }
+
+ size = strlen(value)+1;
+ *pReturnValue = size;
+
+ if (dstBuf) {
+ if (size > dstSize) {
+ dstBuf[0] = '\0';
+ return ERANGE;
+ }
+ memcpy(dstBuf, value, size);
+ }
+
+ return 0;
+}
+
+#define RETT errno_t
+#define FUNC getenv_s
+#define ARGS size_t *pReturnValue, char *dstBuf, rsize_t dstSize, const char
*varName
+#define CALL pReturnValue, dstBuf, dstSize, varName
+#include "msvcrt_or_emu_glue.h"
--
2.20.1
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public