diff --git a/src/node.cc b/src/node.cc index 7a585646f66ec4..ba2c093347f625 100644 --- a/src/node.cc +++ b/src/node.cc @@ -864,8 +864,14 @@ int ProcessGlobalArgs(std::vector* args, if (!errors->empty()) return 9; - for (const std::string& cve : per_process::cli_options->security_reverts) - Revert(cve.c_str()); + std::string revert_error; + for (const std::string& cve : per_process::cli_options->security_reverts) { + Revert(cve.c_str(), &revert_error); + if (!revert_error.empty()) { + errors->emplace_back(std::move(revert_error)); + return 12; + } + } auto env_opts = per_process::cli_options->per_isolate->per_env; if (std::find(v8_args.begin(), v8_args.end(), diff --git a/src/node_revert.h b/src/node_revert.h index 4c0ebcd9fd66b0..38e2ba71053691 100644 --- a/src/node_revert.h +++ b/src/node_revert.h @@ -43,13 +43,14 @@ inline void Revert(const reversion cve) { printf("SECURITY WARNING: Reverting %s\n", RevertMessage(cve)); } -inline void Revert(const char* cve) { +inline void Revert(const char* cve, std::string* error) { #define V(code, label, _) \ if (strcmp(cve, label) == 0) return Revert(SECURITY_REVERT_##code); SECURITY_REVERSIONS(V) #undef V - printf("Error: Attempt to revert an unknown CVE [%s]\n", cve); - exit(12); + *error = "Error: Attempt to revert an unknown CVE ["; + *error += cve; + *error += ']'; } inline bool IsReverted(const reversion cve) { diff --git a/test/parallel/test-security-revert-unknown.js b/test/parallel/test-security-revert-unknown.js new file mode 100644 index 00000000000000..688076ce94582a --- /dev/null +++ b/test/parallel/test-security-revert-unknown.js @@ -0,0 +1,14 @@ +'use strict'; +require('../common'); +const assert = require('assert'); +const { spawnSync } = require('child_process'); +const os = require('os'); + +const { signal, status, output } = + spawnSync(process.execPath, ['--security-reverts=not-a-cve']); +assert.strictEqual(signal, null); +assert.strictEqual(status, 12); +assert.strictEqual( + output[2].toString(), + `${process.execPath}: Error: ` + + `Attempt to revert an unknown CVE [not-a-cve]${os.EOL}`);