From 21951c6bea628e28e7022fd1d31ec37678778188 Mon Sep 17 00:00:00 2001 From: CGQAQ Date: Tue, 29 Oct 2024 11:21:31 +0800 Subject: [PATCH 1/3] src: fix argv memory leaking in FixupArgsForSEA --- src/node_sea.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/node_sea.cc b/src/node_sea.cc index fb9f933a19fa70..459083c5ffbf2f 100644 --- a/src/node_sea.cc +++ b/src/node_sea.cc @@ -271,6 +271,7 @@ std::tuple FixupArgsForSEA(int argc, char** argv) { new_argv.emplace_back(argv[0]); new_argv.insert(new_argv.end(), argv, argv + argc); new_argv.emplace_back(nullptr); + delete[] argv; argc = new_argv.size() - 1; argv = new_argv.data(); } From aabe627bb9bc4900cbcba8b6a36bb4a3c93563d1 Mon Sep 17 00:00:00 2001 From: CGQAQ Date: Tue, 29 Oct 2024 15:30:17 +0800 Subject: [PATCH 2/3] src: only delete[] on windows --- src/node_sea.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/node_sea.cc b/src/node_sea.cc index 459083c5ffbf2f..b993975add4376 100644 --- a/src/node_sea.cc +++ b/src/node_sea.cc @@ -271,7 +271,9 @@ std::tuple FixupArgsForSEA(int argc, char** argv) { new_argv.emplace_back(argv[0]); new_argv.insert(new_argv.end(), argv, argv + argc); new_argv.emplace_back(nullptr); +#ifdef _WIN32 delete[] argv; +#endif argc = new_argv.size() - 1; argv = new_argv.data(); } From d3552b92eb0a073acd695d0ea7d92c00dcdf4f5d Mon Sep 17 00:00:00 2001 From: CGQAQ Date: Fri, 1 Nov 2024 10:03:14 +0800 Subject: [PATCH 3/3] src: apply joyee's suggestion --- src/node.cc | 21 +++++++++++++++------ src/node_sea.cc | 3 --- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/node.cc b/src/node.cc index 26f94be94bae70..09274db1d4aec8 100644 --- a/src/node.cc +++ b/src/node.cc @@ -1422,11 +1422,6 @@ bool LoadSnapshotData(const SnapshotData** snapshot_data_ptr) { } static ExitCode StartInternal(int argc, char** argv) { - CHECK_GT(argc, 0); - - // Hack around with the argv pointer. Used for process.title = "blah". - argv = uv_setup_args(argc, argv); - std::shared_ptr result = InitializeOncePerProcessInternal( std::vector(argv, argv + argc)); @@ -1485,8 +1480,22 @@ static ExitCode StartInternal(int argc, char** argv) { } int Start(int argc, char** argv) { + CHECK_GT(argc, 0); + + // Hack around with the argv pointer. Used for process.title = "blah". + argv = uv_setup_args(argc, argv); + #ifndef DISABLE_SINGLE_EXECUTABLE_APPLICATION - std::tie(argc, argv) = sea::FixupArgsForSEA(argc, argv); + char** new_argv = nullptr; + std::tie(argc, new_argv) = sea::FixupArgsForSEA(argc, argv); + +#ifdef _WIN32 + if (new_argv != argv) { + delete[] argv; + } +#endif + + argv = new_argv; #endif return static_cast(StartInternal(argc, argv)); } diff --git a/src/node_sea.cc b/src/node_sea.cc index b993975add4376..fb9f933a19fa70 100644 --- a/src/node_sea.cc +++ b/src/node_sea.cc @@ -271,9 +271,6 @@ std::tuple FixupArgsForSEA(int argc, char** argv) { new_argv.emplace_back(argv[0]); new_argv.insert(new_argv.end(), argv, argv + argc); new_argv.emplace_back(nullptr); -#ifdef _WIN32 - delete[] argv; -#endif argc = new_argv.size() - 1; argv = new_argv.data(); }