From cb2add8459c486db073ebf48dbd00169bfccb495 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 19 Jan 2026 14:16:45 +0000 Subject: [PATCH] fix: sanitize windows node argv --- src/cli/run-main.ts | 12 +++++++++--- src/entry.ts | 14 ++++++++++---- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/cli/run-main.ts b/src/cli/run-main.ts index 0ad7e7a94..5c3080996 100644 --- a/src/cli/run-main.ts +++ b/src/cli/run-main.ts @@ -52,13 +52,19 @@ export async function runCli(argv: string[] = process.argv) { function stripWindowsNodeExec(argv: string[]): string[] { if (process.platform !== "win32") return argv; const normalizeArg = (value: string): string => value.replace(/^"+|"+$/g, ""); - const execPath = normalizeArg(process.execPath); + const normalizeCandidate = (value: string): string => normalizeArg(value).replace(/^\\\\\\?\\/, ""); + const execPath = normalizeCandidate(process.execPath); const execPathLower = execPath.toLowerCase(); const execBase = path.basename(execPath).toLowerCase(); const isExecPath = (value: string | undefined): boolean => { if (!value) return false; - const lower = normalizeArg(value).toLowerCase(); - return lower === execPathLower || path.basename(lower) === execBase; + const lower = normalizeCandidate(value).toLowerCase(); + return ( + lower === execPathLower || + path.basename(lower) === execBase || + lower.endsWith("\\node.exe") || + lower.endsWith("/node.exe") + ); }; const filtered = argv.filter((arg, index) => index === 0 || !isExecPath(arg)); if (filtered.length < 3) return filtered; diff --git a/src/entry.ts b/src/entry.ts index 2be276896..a40a06451 100644 --- a/src/entry.ts +++ b/src/entry.ts @@ -60,14 +60,20 @@ function ensureExperimentalWarningSuppressed(): boolean { function normalizeWindowsArgv(argv: string[]): string[] { if (process.platform !== "win32") return argv; if (argv.length < 3) return argv; - const execPath = process.execPath; + const normalizeArg = (value: string): string => value.replace(/^"+|"+$/g, ""); + const normalizeCandidate = (value: string): string => normalizeArg(value).replace(/^\\\\\\?\\/, ""); + const execPath = normalizeCandidate(process.execPath); const execPathLower = execPath.toLowerCase(); const execBase = path.basename(execPath).toLowerCase(); - const normalizeArg = (value: string): string => value.replace(/^"+|"+$/g, ""); const isExecPath = (value: string | undefined): boolean => { if (!value) return false; - const lower = normalizeArg(value).toLowerCase(); - return lower === execPathLower || path.basename(lower) === execBase; + const lower = normalizeCandidate(value).toLowerCase(); + return ( + lower === execPathLower || + path.basename(lower) === execBase || + lower.endsWith("\\node.exe") || + lower.endsWith("/node.exe") + ); }; const arg1 = path.basename(argv[1] ?? "").toLowerCase(); const arg2 = path.basename(argv[2] ?? "").toLowerCase();