From 23f8b0251335f46aaf54b45e9370b374c1c238d2 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 10 Sep 2018 12:06:45 +0200 Subject: [PATCH] src: fix `--prof-process` CLI argument handling Make sure that options after `--prof-process` are not treated as Node.js options. Fixes: https://github.com/nodejs/node/issues/22786 PR-URL: https://github.com/nodejs/node/pull/22790 Reviewed-By: Joyee Cheung Reviewed-By: Matteo Collina Reviewed-By: Colin Ihrig Reviewed-By: James M Snell Reviewed-By: Ruben Bridgewater Reviewed-By: Bryan English Reviewed-By: Trivikram Kamat --- lib/internal/bootstrap/node.js | 4 ++- src/node_options.cc | 2 ++ .../parallel/test-tick-processor-arguments.js | 34 +++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 test/parallel/test-tick-processor-arguments.js diff --git a/lib/internal/bootstrap/node.js b/lib/internal/bootstrap/node.js index 418c93f0d5ac4e..7af3a8ad4ade07 100644 --- a/lib/internal/bootstrap/node.js +++ b/lib/internal/bootstrap/node.js @@ -694,9 +694,11 @@ for (const [ from, expansion ] of aliases) { let isAccepted = true; for (const to of expansion) { - if (!to.startsWith('-')) continue; + if (!to.startsWith('-') || to === '--') continue; const recursiveExpansion = aliases.get(to); if (recursiveExpansion) { + if (recursiveExpansion[0] === to) + recursiveExpansion.splice(0, 1); expansion.push(...recursiveExpansion); continue; } diff --git a/src/node_options.cc b/src/node_options.cc index c1cbb59e291044..8027ee677c1e12 100644 --- a/src/node_options.cc +++ b/src/node_options.cc @@ -108,6 +108,8 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() { AddOption("--prof-process", "process V8 profiler output generated using --prof", &EnvironmentOptions::prof_process); + // Options after --prof-process are passed through to the prof processor. + AddAlias("--prof-process", { "--prof-process", "--" }); AddOption("--redirect-warnings", "write warnings to file instead of stderr", &EnvironmentOptions::redirect_warnings, diff --git a/test/parallel/test-tick-processor-arguments.js b/test/parallel/test-tick-processor-arguments.js new file mode 100644 index 00000000000000..606dbd03c8f6c4 --- /dev/null +++ b/test/parallel/test-tick-processor-arguments.js @@ -0,0 +1,34 @@ +'use strict'; +const common = require('../common'); +const tmpdir = require('../common/tmpdir'); +const fs = require('fs'); +const assert = require('assert'); +const { spawnSync } = require('child_process'); + +if (!common.isMainThread) + common.skip('chdir not available in workers'); +if (!common.enoughTestMem) + common.skip('skipped due to memory requirements'); +if (common.isAIX) + common.skip('does not work on AIX'); + +tmpdir.refresh(); +process.chdir(tmpdir.path); + +// Generate log file. +spawnSync(process.execPath, [ '--prof', '-p', '42' ]); + +const logfile = fs.readdirSync('.').filter((name) => name.endsWith('.log'))[0]; +assert(logfile); + +// Make sure that the --preprocess argument is passed through correctly, +// as an example flag listed in deps/v8/tools/tickprocessor.js. +// Any of the other flags there should work for this test too, if --preprocess +// is ever removed. +const { stdout } = spawnSync( + process.execPath, + [ '--prof-process', '--preprocess', logfile ], + { encoding: 'utf8' }); + +// Make sure that the result is valid JSON. +JSON.parse(stdout);