Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartosz Sosnowski <bartosz@janeasystems.com>2020-07-22 13:55:11 +0300
committerBartosz Sosnowski <bartosz@janeasystems.com>2020-08-20 13:36:32 +0300
commitde565ad1b2de6d173a9ea5e1932e3d85472d4c23 (patch)
tree734cfcfbbc6f83280774b410311b7303f7e758b7
parent03293aa3a1e810c5ae6938cae41bf62ae418bb5f (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.cc16
-rw-r--r--test/parallel/test-unicode-node-options.js26
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);
+}