From b043f5e704a9e74a58648a8c0e73edd3dacd67e2 Mon Sep 17 00:00:00 2001 From: Archkon <180910180+Archkon@users.noreply.github.com> Date: Sun, 26 Jul 2026 18:51:09 +0800 Subject: [PATCH] sea: avoid dangling CLI option pointers Reserve exec argv storage before inserting configured and CLI-expanded arguments so vector reallocation cannot invalidate pointers in argv. Signed-off-by: Archkon <180910180+Archkon@users.noreply.github.com> --- src/node_sea.cc | 5 +++-- test/fixtures/sea/exec-argv-extension-cli/sea-config.json | 1 - test/fixtures/sea/exec-argv-extension-cli/sea.js | 2 +- ...single-executable-application-exec-argv-extension-cli.js | 6 +++++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/node_sea.cc b/src/node_sea.cc index 1be41e6f14146e..3b9741f73a883d 100644 --- a/src/node_sea.cc +++ b/src/node_sea.cc @@ -321,10 +321,11 @@ std::tuple FixupArgsForSEA(int argc, char** argv) { cli_extension_args.size() + 2); new_argv.emplace_back(argv[0]); + exec_argv_storage.reserve(sea_resource.exec_argv.size() + + cli_extension_args.size()); + // Insert exec argv from SEA config if (!sea_resource.exec_argv.empty()) { - exec_argv_storage.reserve(sea_resource.exec_argv.size() + - cli_extension_args.size()); for (const auto& arg : sea_resource.exec_argv) { exec_argv_storage.emplace_back(arg); new_argv.emplace_back(exec_argv_storage.back().data()); diff --git a/test/fixtures/sea/exec-argv-extension-cli/sea-config.json b/test/fixtures/sea/exec-argv-extension-cli/sea-config.json index 0ec0d706b384ab..cb4606558c7fb4 100644 --- a/test/fixtures/sea/exec-argv-extension-cli/sea-config.json +++ b/test/fixtures/sea/exec-argv-extension-cli/sea-config.json @@ -2,6 +2,5 @@ "main": "sea.js", "output": "sea-prep.blob", "disableExperimentalSEAWarning": true, - "execArgv": ["--no-warnings"], "execArgvExtension": "cli" } diff --git a/test/fixtures/sea/exec-argv-extension-cli/sea.js b/test/fixtures/sea/exec-argv-extension-cli/sea.js index e9585483fcc21d..11bc7fa36560dc 100644 --- a/test/fixtures/sea/exec-argv-extension-cli/sea.js +++ b/test/fixtures/sea/exec-argv-extension-cli/sea.js @@ -3,7 +3,7 @@ const assert = require('assert'); console.log('process.argv:', JSON.stringify(process.argv)); console.log('process.execArgv:', JSON.stringify(process.execArgv)); -// Should have execArgv from SEA config + CLI --node-options +// Should have all options from CLI --node-options assert.deepStrictEqual(process.execArgv, ['--no-warnings', '--max-old-space-size=1024']); assert.deepStrictEqual(process.argv.slice(2), [ diff --git a/test/sea/test-single-executable-application-exec-argv-extension-cli.js b/test/sea/test-single-executable-application-exec-argv-extension-cli.js index 3999cf0cbaecf6..8b4b103ddb8415 100644 --- a/test/sea/test-single-executable-application-exec-argv-extension-cli.js +++ b/test/sea/test-single-executable-application-exec-argv-extension-cli.js @@ -23,7 +23,11 @@ const outputFile = buildSEA(fixtures.path('sea', 'exec-argv-extension-cli')); // Test that --node-options works with execArgvExtension: "cli" spawnSyncAndAssert( outputFile, - ['--node-options=--max-old-space-size=1024', 'user-arg1', 'user-arg2'], + [ + '--node-options=--no-warnings --max-old-space-size=1024', + 'user-arg1', + 'user-arg2', + ], { env: { ...process.env,