Module: wine Branch: oldstable Commit: e5c7a6685d6293c5c69b84aea744e0b89697b80a URL: https://gitlab.winehq.org/wine/wine/-/commit/e5c7a6685d6293c5c69b84aea744e0b...
Author: Piotr Caban piotr@codeweavers.com Date: Fri Oct 21 13:28:23 2022 +0200
msvcrt: Fix _putenv_s return value on error.
(cherry picked from commit 53acb6e736d6feb10b19fd609771ecfa33f7d1e9) Signed-off-by: Michael Stefaniuc mstefani@winehq.org
---
dlls/msvcrt/environ.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/dlls/msvcrt/environ.c b/dlls/msvcrt/environ.c index 5e07fe5e367..5c4db668be3 100644 --- a/dlls/msvcrt/environ.c +++ b/dlls/msvcrt/environ.c @@ -165,17 +165,22 @@ finish: */ int CDECL _putenv_s(const char *name, const char *value) { - int ret; + errno_t ret = 0;
TRACE("%s %s\n", debugstr_a(name), debugstr_a(value));
- if (!MSVCRT_CHECK_PMT(name != NULL)) return -1; - if (!MSVCRT_CHECK_PMT(value != NULL)) return -1; - - ret = SetEnvironmentVariableA(name, value[0] ? value : NULL) ? 0 : -1; + if (!MSVCRT_CHECK_PMT(name != NULL)) return EINVAL; + if (!MSVCRT_CHECK_PMT(value != NULL)) return EINVAL;
- /* _putenv returns success on deletion of nonexistent variable, unlike [Rtl]SetEnvironmentVariable */ - if ((ret == -1) && (GetLastError() == ERROR_ENVVAR_NOT_FOUND)) ret = 0; + if (!SetEnvironmentVariableA(name, value[0] ? value : NULL)) + { + /* _putenv returns success on deletion of nonexistent variable */ + if (GetLastError() != ERROR_ENVVAR_NOT_FOUND) + { + msvcrt_set_errno(GetLastError()); + ret = *_errno(); + } + }
MSVCRT__environ = msvcrt_SnapshotOfEnvironmentA(MSVCRT__environ); MSVCRT__wenviron = msvcrt_SnapshotOfEnvironmentW(MSVCRT__wenviron);