From ca6727303d1d4d4625b244e3c5655a8fa7195422 Mon Sep 17 00:00:00 2001 From: Ekopalypse <47723516+Ekopalypse@users.noreply.github.com> Date: Thu, 21 Nov 2024 00:33:02 +0100 Subject: [PATCH] os: use _wputenv instead of _putenv to stay in sync with _wgetenv (fix changing env variables with non ASCII content on windows) (#22920) --- vlib/builtin/cfns.c.v | 1 + vlib/os/environment.c.v | 16 +++++++++++----- vlib/os/environment_test.v | 16 ++++++++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/vlib/builtin/cfns.c.v b/vlib/builtin/cfns.c.v index 60fd364d69..5f086d3b3d 100644 --- a/vlib/builtin/cfns.c.v +++ b/vlib/builtin/cfns.c.v @@ -327,6 +327,7 @@ fn C._wsystem(command &u16) int fn C._wgetenv(varname &u16) voidptr fn C._putenv(envstring &char) int +fn C._wputenv(envstring &u16) int fn C._waccess(path &u16, mode int) int diff --git a/vlib/os/environment.c.v b/vlib/os/environment.c.v index 6d4087c8e3..6d155ace37 100644 --- a/vlib/os/environment.c.v +++ b/vlib/os/environment.c.v @@ -45,15 +45,18 @@ pub fn getenv_opt(key string) ?string { // os.setenv sets the value of an environment variable with `name` to `value`. pub fn setenv(name string, value string, overwrite bool) int { $if windows { - format := '${name}=${value}' + format := '${name}=${value}'.to_wide() + defer { + unsafe { free(voidptr(format)) } + } if overwrite { unsafe { - return C._putenv(&char(format.str)) + return C._wputenv(format) } } else { if getenv(name).len == 0 { unsafe { - return C._putenv(&char(format.str)) + return C._wputenv(format) } } } @@ -68,8 +71,11 @@ pub fn setenv(name string, value string, overwrite bool) int { // os.unsetenv clears an environment variable with `name`. pub fn unsetenv(name string) int { $if windows { - format := '${name}=' - return C._putenv(&char(format.str)) + format := '${name}='.to_wide() + defer { + unsafe { free(voidptr(format)) } + } + return C._wputenv(format) } $else { return C.unsetenv(&char(name.str)) } diff --git a/vlib/os/environment_test.v b/vlib/os/environment_test.v index 57a8a7af71..df814987f1 100644 --- a/vlib/os/environment_test.v +++ b/vlib/os/environment_test.v @@ -52,3 +52,19 @@ fn test_getenv_empty_var() { os.setenv('empty${key}', '""', false) assert os.getenv('empty${key}') == '""' } + +fn test_environ_non_ascii() { + os.setenv('Büro', 'gebäude', false) + assert os.getenv('Büro') == 'gebäude' + os.setenv('Büro', 'gebäudehaus', true) + assert os.getenv('Büro') == 'gebäudehaus' + os.setenv('Büro', 'gebäudehaus in der Straße', true) + assert os.getenv('Büro') == 'gebäudehaus in der Straße' + os.unsetenv('Büro') + assert os.getenv('Büro') == '' + + os.setenv('한국어', '초보자를 위한', false) + assert os.getenv('한국어') == '초보자를 위한' + os.unsetenv('한국어') + assert os.getenv('한국어') == '' +}