From: Rémi Bernon rbernon@codeweavers.com
--- dlls/msvcr80/tests/msvcr80.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
diff --git a/dlls/msvcr80/tests/msvcr80.c b/dlls/msvcr80/tests/msvcr80.c index a2a3734f6c0..0910dc83b3d 100644 --- a/dlls/msvcr80/tests/msvcr80.c +++ b/dlls/msvcr80/tests/msvcr80.c @@ -62,6 +62,7 @@ static int (__cdecl *p__close)(int); static intptr_t (__cdecl *p__get_osfhandle)(int); static int (__cdecl *p_strcmp)(const char *, const char *); static int (__cdecl *p_strncmp)(const char *, const char *, size_t); +static int (__cdecl *p_dupenv_s)(char **, size_t *, const char *);
#define SETNOFAIL(x,y) x = (void*)GetProcAddress(hcrt,y) #define SET(x,y) do { SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y); } while(0) @@ -83,6 +84,7 @@ static BOOL init(void)
SET(p_strcmp, "strcmp"); SET(p_strncmp, "strncmp"); + SET(p_dupenv_s, "_dupenv_s");
return TRUE; } @@ -184,6 +186,23 @@ static void test_strcmp(void) ok( ret == 0, "wrong ret %d\n", ret ); }
+static void test_dupenv_s(void) +{ + size_t len; + char *tmp; + int ret; + + len = 0xdeadbeef; + tmp = (void *)0xdeadbeef; + ret = p_dupenv_s( &tmp, &len, "nonexistent" ); + todo_wine + ok( !ret, "_dupenv_s returned %d\n", ret ); + todo_wine + ok( !len, "_dupenv_s returned length is %Id\n", len ); + todo_wine + ok( !tmp, "_dupenv_s returned pointer is %p\n", tmp ); +} + START_TEST(msvcr80) { if(!init()) @@ -191,4 +210,5 @@ START_TEST(msvcr80)
test_ioinfo_flags(); test_strcmp(); + test_dupenv_s(); }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/msvcr80/tests/msvcr80.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
diff --git a/dlls/msvcr80/tests/msvcr80.c b/dlls/msvcr80/tests/msvcr80.c index 0910dc83b3d..34f50cd6a69 100644 --- a/dlls/msvcr80/tests/msvcr80.c +++ b/dlls/msvcr80/tests/msvcr80.c @@ -63,6 +63,7 @@ static intptr_t (__cdecl *p__get_osfhandle)(int); static int (__cdecl *p_strcmp)(const char *, const char *); static int (__cdecl *p_strncmp)(const char *, const char *, size_t); static int (__cdecl *p_dupenv_s)(char **, size_t *, const char *); +static int (__cdecl *p_wdupenv_s)(wchar_t **, size_t *, const wchar_t *);
#define SETNOFAIL(x,y) x = (void*)GetProcAddress(hcrt,y) #define SET(x,y) do { SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y); } while(0) @@ -85,6 +86,7 @@ static BOOL init(void) SET(p_strcmp, "strcmp"); SET(p_strncmp, "strncmp"); SET(p_dupenv_s, "_dupenv_s"); + SET(p_wdupenv_s, "_wdupenv_s");
return TRUE; } @@ -203,6 +205,23 @@ static void test_dupenv_s(void) ok( !tmp, "_dupenv_s returned pointer is %p\n", tmp ); }
+static void test_wdupenv_s(void) +{ + wchar_t *tmp; + size_t len; + int ret; + + len = 0xdeadbeef; + tmp = (void *)0xdeadbeef; + ret = p_wdupenv_s( &tmp, &len, L"nonexistent" ); + todo_wine + ok( !ret, "_wdupenv_s returned %d\n", ret ); + todo_wine + ok( !len, "_wdupenv_s returned length is %Id\n", len ); + todo_wine + ok( !tmp, "_wdupenv_s returned pointer is %p\n", tmp ); +} + START_TEST(msvcr80) { if(!init()) @@ -211,4 +230,5 @@ START_TEST(msvcr80) test_ioinfo_flags(); test_strcmp(); test_dupenv_s(); + test_wdupenv_s(); }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/msvcr80/tests/msvcr80.c | 3 --- dlls/msvcrt/environ.c | 7 ++++++- 2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/dlls/msvcr80/tests/msvcr80.c b/dlls/msvcr80/tests/msvcr80.c index 34f50cd6a69..961bef504b6 100644 --- a/dlls/msvcr80/tests/msvcr80.c +++ b/dlls/msvcr80/tests/msvcr80.c @@ -197,11 +197,8 @@ static void test_dupenv_s(void) len = 0xdeadbeef; tmp = (void *)0xdeadbeef; ret = p_dupenv_s( &tmp, &len, "nonexistent" ); - todo_wine ok( !ret, "_dupenv_s returned %d\n", ret ); - todo_wine ok( !len, "_dupenv_s returned length is %Id\n", len ); - todo_wine ok( !tmp, "_dupenv_s returned pointer is %p\n", tmp ); }
diff --git a/dlls/msvcrt/environ.c b/dlls/msvcrt/environ.c index 729eb0560bd..437d4d6171f 100644 --- a/dlls/msvcrt/environ.c +++ b/dlls/msvcrt/environ.c @@ -249,7 +249,12 @@ int CDECL _dupenv_s(char **buffer, size_t *numberOfElements, const char *varname if (!MSVCRT_CHECK_PMT(buffer != NULL)) return EINVAL; if (!MSVCRT_CHECK_PMT(varname != NULL)) return EINVAL;
- if (!(e = getenv(varname))) return *_errno() = EINVAL; + if (!(e = getenv(varname))) + { + *buffer = NULL; + *numberOfElements = 0; + return 0; + }
sz = strlen(e) + 1; if (!(*buffer = malloc(sz)))
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/msvcr80/tests/msvcr80.c | 3 --- dlls/msvcrt/environ.c | 7 ++++++- 2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/dlls/msvcr80/tests/msvcr80.c b/dlls/msvcr80/tests/msvcr80.c index 961bef504b6..fa04b024031 100644 --- a/dlls/msvcr80/tests/msvcr80.c +++ b/dlls/msvcr80/tests/msvcr80.c @@ -211,11 +211,8 @@ static void test_wdupenv_s(void) len = 0xdeadbeef; tmp = (void *)0xdeadbeef; ret = p_wdupenv_s( &tmp, &len, L"nonexistent" ); - todo_wine ok( !ret, "_wdupenv_s returned %d\n", ret ); - todo_wine ok( !len, "_wdupenv_s returned length is %Id\n", len ); - todo_wine ok( !tmp, "_wdupenv_s returned pointer is %p\n", tmp ); }
diff --git a/dlls/msvcrt/environ.c b/dlls/msvcrt/environ.c index 437d4d6171f..a422a183e06 100644 --- a/dlls/msvcrt/environ.c +++ b/dlls/msvcrt/environ.c @@ -279,7 +279,12 @@ int CDECL _wdupenv_s(wchar_t **buffer, size_t *numberOfElements, if (!MSVCRT_CHECK_PMT(buffer != NULL)) return EINVAL; if (!MSVCRT_CHECK_PMT(varname != NULL)) return EINVAL;
- if (!(e = _wgetenv(varname))) return *_errno() = EINVAL; + if (!(e = _wgetenv(varname))) + { + *buffer = NULL; + *numberOfElements = 0; + return 0; + }
sz = wcslen(e) + 1; if (!(*buffer = malloc(sz * sizeof(wchar_t))))