From a2d74f95fc50e50eee1e50097631d30022474307 Mon Sep 17 00:00:00 2001 From: FabianLars Date: Wed, 11 Jun 2025 15:04:22 +0200 Subject: [PATCH] fix(updater): Escape current_exe args for nsis installer --- .changes/fix-nsis-updater-args.md | 6 +++++ plugins/updater/src/updater.rs | 43 ++++++++++++++++++++++++------- 2 files changed, 39 insertions(+), 10 deletions(-) create mode 100644 .changes/fix-nsis-updater-args.md diff --git a/.changes/fix-nsis-updater-args.md b/.changes/fix-nsis-updater-args.md new file mode 100644 index 00000000..b2483090 --- /dev/null +++ b/.changes/fix-nsis-updater-args.md @@ -0,0 +1,6 @@ +--- +updater: patch +updater-js: patch +--- + +Fixed an issue preventing updates via the NSIS installer from succeeding when the app was launched with command line arguments containing spaces. diff --git a/plugins/updater/src/updater.rs b/plugins/updater/src/updater.rs index 78fc0a9b..583511e0 100644 --- a/plugins/updater/src/updater.rs +++ b/plugins/updater/src/updater.rs @@ -683,17 +683,25 @@ impl Update { let install_mode = self.config.install_mode(); let current_args = &self.current_exe_args()[1..]; let msi_args; + let nsis_args; let installer_args: Vec<&OsStr> = match &updater_type { - WindowsUpdaterType::Nsis { .. } => install_mode - .nsis_args() - .iter() - .map(OsStr::new) - .chain(once(OsStr::new("/UPDATE"))) - .chain(once(OsStr::new("/ARGS"))) - .chain(current_args.to_vec()) - .chain(self.installer_args()) - .collect(), + WindowsUpdaterType::Nsis { .. } => { + nsis_args = current_args + .iter() + .map(escape_nsis_current_exe_arg) + .collect::>(); + + install_mode + .nsis_args() + .iter() + .map(OsStr::new) + .chain(once(OsStr::new("/UPDATE"))) + .chain(once(OsStr::new("/ARGS"))) + .chain(nsis_args.iter().map(OsStr::new)) + .chain(self.installer_args()) + .collect() + } WindowsUpdaterType::Msi { path, .. } => { let escaped_args = current_args .iter() @@ -1363,6 +1371,21 @@ impl PathExt for PathBuf { } } +#[cfg(windows)] +fn escape_nsis_current_exe_arg(arg: &&OsStr) -> String { + let mut arg = dbg!(arg.to_string_lossy().to_string()); + + /* if arg.contains('"') { + arg = arg.replace('"', r#""""#); + } */ + + if arg.contains(' ') || arg.contains('\t') || arg.contains('/') { + arg = format!("\"{arg}\""); + } + + arg +} + #[cfg(windows)] fn escape_msi_property_arg(arg: impl AsRef) -> String { let mut arg = arg.as_ref().to_string_lossy().to_string(); @@ -1375,7 +1398,7 @@ fn escape_msi_property_arg(arg: impl AsRef) -> String { } if arg.contains('"') { - arg = arg.replace('"', r#""""""#) + arg = arg.replace('"', r#""""""#); } if arg.starts_with('-') {