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:
Bartosz Sosnowski
2020-07-22 12:55:11 +02:00
parent 03293aa3a1
commit de565ad1b2
2 changed files with 40 additions and 2 deletions

View File

@@ -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;
}
}

View 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);
}