mirror of
https://github.com/zebrajr/node.git
synced 2026-01-15 12:15:26 +00:00
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>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
26
test/parallel/test-unicode-node-options.js
Normal file
26
test/parallel/test-unicode-node-options.js
Normal file
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user