From 85739b6c5b5d12204a81de18ceddf2d357effb8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=B0=E5=85=85?= Date: Wed, 30 Aug 2017 17:57:12 +0800 Subject: [PATCH] child_process: ignore undef/proto values of env MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit At present, undefined values of env option will be transferred as a "undefined" string value, and values in prototype will also be included, which are not usual behaviors. This commit prevents those to be transferred to the environment of the child process. PR-URL: https://github.com/nodejs/node/pull/15089 Fixes: https://github.com/nodejs/node/issues/15087 Reviewed-By: James M Snell Reviewed-By: Benjamin Gruenbaum Reviewed-By: Anna Henningsen Reviewed-By: Michaƫl Zasso --- doc/api/child_process.md | 2 ++ lib/child_process.js | 7 +++++-- test/parallel/test-child-process-env.js | 11 +++++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/doc/api/child_process.md b/doc/api/child_process.md index c88443e078b0a6..38c94dbf908025 100644 --- a/doc/api/child_process.md +++ b/doc/api/child_process.md @@ -437,6 +437,8 @@ If not given, the default is to inherit the current working directory. Use `env` to specify environment variables that will be visible to the new process, the default is [`process.env`][]. +`undefined` values in `env` will be ignored. + Example of running `ls -lh /usr`, capturing `stdout`, `stderr`, and the exit code: diff --git a/lib/child_process.js b/lib/child_process.js index d1c4d2f2903516..f2c1a0c237bd98 100644 --- a/lib/child_process.js +++ b/lib/child_process.js @@ -504,8 +504,11 @@ function normalizeSpawnArguments(file, args, options) { var env = options.env || process.env; var envPairs = []; - for (var key in env) { - envPairs.push(`${key}=${env[key]}`); + for (const key of Object.keys(env)) { + const value = env[key]; + if (value !== undefined) { + envPairs.push(`${key}=${value}`); + } } _convertCustomFds(options); diff --git a/test/parallel/test-child-process-env.js b/test/parallel/test-child-process-env.js index 4582c48fda5db1..5bd02c24badef5 100644 --- a/test/parallel/test-child-process-env.js +++ b/test/parallel/test-child-process-env.js @@ -22,11 +22,15 @@ 'use strict'; const common = require('../common'); const assert = require('assert'); +const os = require('os'); const spawn = require('child_process').spawn; const env = { - 'HELLO': 'WORLD' + 'HELLO': 'WORLD', + 'UNDEFINED': undefined, + 'NULL': null, + 'EMPTY': '' }; Object.setPrototypeOf(env, { 'FOO': 'BAR' @@ -53,5 +57,8 @@ child.stdout.on('data', function(chunk) { process.on('exit', function() { assert.ok(response.includes('HELLO=WORLD')); - assert.ok(response.includes('FOO=BAR')); + assert.ok(!response.includes('FOO=')); + assert.ok(!response.includes('UNDEFINED=undefined')); + assert.ok(response.includes('NULL=null')); + assert.ok(response.includes(`EMPTY=${os.EOL}`)); });