fix(updater): Escape current_exe args for nsis installer

fix/updater-nsis-args
FabianLars 3 days ago
parent 106e46ed51
commit a2d74f95fc
No known key found for this signature in database

@ -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.

@ -683,17 +683,25 @@ impl Update {
let install_mode = self.config.install_mode(); let install_mode = self.config.install_mode();
let current_args = &self.current_exe_args()[1..]; let current_args = &self.current_exe_args()[1..];
let msi_args; let msi_args;
let nsis_args;
let installer_args: Vec<&OsStr> = match &updater_type { let installer_args: Vec<&OsStr> = match &updater_type {
WindowsUpdaterType::Nsis { .. } => install_mode WindowsUpdaterType::Nsis { .. } => {
.nsis_args() nsis_args = current_args
.iter() .iter()
.map(OsStr::new) .map(escape_nsis_current_exe_arg)
.chain(once(OsStr::new("/UPDATE"))) .collect::<Vec<_>>();
.chain(once(OsStr::new("/ARGS")))
.chain(current_args.to_vec()) install_mode
.chain(self.installer_args()) .nsis_args()
.collect(), .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, .. } => { WindowsUpdaterType::Msi { path, .. } => {
let escaped_args = current_args let escaped_args = current_args
.iter() .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)] #[cfg(windows)]
fn escape_msi_property_arg(arg: impl AsRef<OsStr>) -> String { fn escape_msi_property_arg(arg: impl AsRef<OsStr>) -> String {
let mut arg = arg.as_ref().to_string_lossy().to_string(); let mut arg = arg.as_ref().to_string_lossy().to_string();
@ -1375,7 +1398,7 @@ fn escape_msi_property_arg(arg: impl AsRef<OsStr>) -> String {
} }
if arg.contains('"') { if arg.contains('"') {
arg = arg.replace('"', r#""""""#) arg = arg.replace('"', r#""""""#);
} }
if arg.starts_with('-') { if arg.starts_with('-') {

Loading…
Cancel
Save