diff options
author | Bartosz Sosnowski <bartosz@janeasystems.com> | 2020-07-22 13:55:11 +0300 |
---|---|---|
committer | Bartosz Sosnowski <bartosz@janeasystems.com> | 2020-08-20 13:36:32 +0300 |
commit | de565ad1b2de6d173a9ea5e1932e3d85472d4c23 (patch) | |
tree | 734cfcfbbc6f83280774b410311b7303f7e758b7 | |
parent | 03293aa3a1e810c5ae6938cae41bf62ae418bb5f (diff) |
process: correctly parse Unicode in NODE_OPTIONS
Fixes an issue on Windows, where Unicode in NODE_OPTIONS was not parsed
correctly.
Fixes: https://github.com/nodejs/node/issues/34399
PR-URL: https://github.com/nodejs/node/pull/34476
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: Denys Otrishko <shishugi@gmail.com>
-rw-r--r-- | src/node_credentials.cc | 16 | ||||
-rw-r--r-- | test/parallel/test-unicode-node-options.js | 26 |
2 files changed, 40 insertions, 2 deletions
diff --git a/src/node_credentials.cc b/src/node_credentials.cc index acc48cac3c9..fa3dfa48a3c 100644 --- a/src/node_credentials.cc +++ b/src/node_credentials.cc @@ -57,8 +57,20 @@ bool SafeGetenv(const char* key, std::string* text, Environment* env) { { Mutex::ScopedLock lock(per_process::env_var_mutex); - if (const char* value = getenv(key)) { - *text = value; + + size_t init_sz = 256; + MaybeStackBuffer<char, 256> val; + int ret = uv_os_getenv(key, *val, &init_sz); + + if (ret == UV_ENOBUFS) { + // Buffer is not large enough, reallocate to the updated init_sz + // and fetch env value again. + val.AllocateSufficientStorage(init_sz); + ret = uv_os_getenv(key, *val, &init_sz); + } + + if (ret >= 0) { // Env key value fetch success. + *text = *val; return true; } } diff --git a/test/parallel/test-unicode-node-options.js b/test/parallel/test-unicode-node-options.js new file mode 100644 index 00000000000..e5a40d11879 --- /dev/null +++ b/test/parallel/test-unicode-node-options.js @@ -0,0 +1,26 @@ +'use strict'; +// Flags: --expose-internals +require('../common'); +const { getOptionValue } = require('internal/options'); +const assert = require('assert'); +const cp = require('child_process'); + +const expected_redirect_value = 'foĆ³'; + +if (process.argv.length === 2) { + const NODE_OPTIONS = `--redirect-warnings=${expected_redirect_value}`; + const result = cp.spawnSync(process.argv0, + ['--expose-internals', __filename, 'test'], + { + env: { + ...process.env, + NODE_OPTIONS + }, + stdio: 'inherit' + }); + assert.strictEqual(result.status, 0); +} else { + const redirect_value = getOptionValue('--redirect-warnings'); + console.log(`--redirect-warings=${redirect_value}`); + assert.strictEqual(redirect_value, expected_redirect_value); +} |