process: normalize process.argv before user code execution

And make sure that `process.argv` from the preloaded modules
is the same as the one in the main module.

Refs: https://github.com/nodejs/node/issues/25967
PR-URL: https://github.com/nodejs/node/pull/26000
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Richard Lau <riclau@uk.ibm.com>
Reviewed-By: Minwoo Jung <minwoo@nodesource.com>
This commit is contained in:
Joyee Cheung 2019-02-08 11:22:37 +08:00
parent 84000835e2
commit 69714ab1c4
No known key found for this signature in database
GPG Key ID: 92B78A53C8303B8D
3 changed files with 48 additions and 5 deletions

View File

@ -17,9 +17,6 @@ const {
stripShebang, stripBOM
} = require('internal/modules/cjs/helpers');
// TODO(joyeecheung): not every one of these are necessary
prepareMainThreadExecution();
markBootstrapComplete();
if (process.argv[1] && process.argv[1] !== '-') {
// Expand process.argv[1] into a full path.
@ -31,8 +28,16 @@ if (process.argv[1] && process.argv[1] !== '-') {
const fs = require('fs');
const source = fs.readFileSync(filename, 'utf-8');
// TODO(joyeecheung): not every one of these are necessary
prepareMainThreadExecution();
markBootstrapComplete();
checkScriptSyntax(source, filename);
} else {
// TODO(joyeecheung): not every one of these are necessary
prepareMainThreadExecution();
markBootstrapComplete();
readStdin((code) => {
checkScriptSyntax(code, '[stdin]');
});

View File

@ -4,12 +4,12 @@ const {
prepareMainThreadExecution
} = require('internal/bootstrap/pre_execution');
prepareMainThreadExecution();
// Expand process.argv[1] into a full path.
const path = require('path');
process.argv[1] = path.resolve(process.argv[1]);
prepareMainThreadExecution();
const CJSModule = require('internal/modules/cjs/loader');
markBootstrapComplete();

View File

@ -0,0 +1,38 @@
'use strict';
// This tests that process.argv is the same in the preloaded module
// and the user module.
const common = require('../common');
const tmpdir = require('../common/tmpdir');
const assert = require('assert');
const { spawnSync } = require('child_process');
const fs = require('fs');
if (!common.isMainThread) {
common.skip('Cannot chdir to the tmp directory in workers');
}
tmpdir.refresh();
process.chdir(tmpdir.path);
fs.writeFileSync(
'preload.js',
'console.log(JSON.stringify(process.argv));',
'utf-8');
fs.writeFileSync(
'main.js',
'console.log(JSON.stringify(process.argv));',
'utf-8');
const child = spawnSync(process.execPath, ['-r', './preload.js', 'main.js']);
if (child.status !== 0) {
console.log(child.stderr.toString());
assert.strictEqual(child.status, 0);
}
const lines = child.stdout.toString().trim().split('\n');
assert.deepStrictEqual(JSON.parse(lines[0]), JSON.parse(lines[1]));