From 5bddc9a741a3de0673476ceaf9f8bd61afa60132 Mon Sep 17 00:00:00 2001 From: Bryce Simonds Date: Mon, 23 May 2016 16:14:02 -0500 Subject: [PATCH] src: fix Windows segfault with `--eval` When specifing a parameter that requries an additional argument on the command line, node would segfault. This appears to be specific to Windows, adjusted command line argument parsing to hold a nullptr terminal. Adding unit test for crash on missing arguments. PR-URL: https://github.com/nodejs/node/pull/6938 Reviewed-By: Anna Henningsen Reviewed-By: Sakthipriyan Vairamani Reviewed-By: Ben Noordhuis --- src/node_main.cc | 3 ++- test/parallel/test-cli-eval.js | 10 ++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/node_main.cc b/src/node_main.cc index dce72aff22f317..02082ba0169c83 100644 --- a/src/node_main.cc +++ b/src/node_main.cc @@ -11,7 +11,7 @@ int wmain(int argc, wchar_t *wargv[]) { } // Convert argv to to UTF8 - char** argv = new char*[argc]; + char** argv = new char*[argc + 1]; for (int i = 0; i < argc; i++) { // Compute the size of the required buffer DWORD size = WideCharToMultiByte(CP_UTF8, @@ -43,6 +43,7 @@ int wmain(int argc, wchar_t *wargv[]) { exit(1); } } + argv[argc] = nullptr; // Now that conversion is done, we can finally start. return node::Start(argc, argv); } diff --git a/test/parallel/test-cli-eval.js b/test/parallel/test-cli-eval.js index a58c023eb6d835..f22084bc690395 100644 --- a/test/parallel/test-cli-eval.js +++ b/test/parallel/test-cli-eval.js @@ -40,11 +40,11 @@ child.exec(nodejs + ' --eval "console.error(42)"', assert.equal(stderr, ''); }); - child.exec(cmd + "'[]'", + child.exec(cmd + "'[]'", common.mustCall( function(err, stdout, stderr) { assert.equal(stdout, '[]\n'); assert.equal(stderr, ''); - }); + })); }); // assert that module loading works @@ -66,6 +66,12 @@ child.exec(nodejs + ' --eval "require(\'./test/parallel/test-cli-eval.js\')"', assert.equal(status.code, 42); }); +// Missing argument should not crash +child.exec(nodejs + ' -e', common.mustCall(function(status, stdout, stderr) { + assert.notStrictEqual(status, null); + assert.strictEqual(status.code, 9); +})); + // empty program should do nothing child.exec(nodejs + ' -e ""', function(status, stdout, stderr) { assert.equal(stdout, '');