From 2a695af13acdc6cfff906bb7137351d4c724271e Mon Sep 17 00:00:00 2001 From: DuProcess <273172371+DuProcess@users.noreply.github.com> Date: Thu, 16 Jul 2026 21:52:35 -0400 Subject: [PATCH] Harden Windows deferred update wait --- src/bin/dosh-client.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/bin/dosh-client.rs b/src/bin/dosh-client.rs index 5a8cd72..a611448 100644 --- a/src/bin/dosh-client.rs +++ b/src/bin/dosh-client.rs @@ -4809,7 +4809,12 @@ fn windows_deferred_update_script(parent_pid: u32, installer_script: &str) -> St format!( "$ErrorActionPreference='Stop';\ $ProgressPreference='SilentlyContinue';\ - while (Get-Process -Id {parent_pid} -ErrorAction SilentlyContinue) {{ \ + $parent=Get-Process -Id {parent_pid} -ErrorAction SilentlyContinue;\ + $parentStart=if ($parent) {{ $parent.StartTime }} else {{ $null }};\ + while ($true) {{ \ + $current=Get-Process -Id {parent_pid} -ErrorAction SilentlyContinue;\ + if (-not $current) {{ break }};\ + if ($parentStart -and $current.StartTime -ne $parentStart) {{ break }};\ Start-Sleep -Milliseconds 100 \ }};\ {installer_script}" @@ -13172,6 +13177,15 @@ mod tests { ); let deferred = windows_deferred_update_script(4242, &installer); assert!(deferred.contains("Get-Process -Id 4242 -ErrorAction SilentlyContinue")); + assert!( + deferred.contains("$parentStart=if ($parent) { $parent.StartTime } else { $null }") + ); + assert!(deferred.contains("$current=Get-Process -Id 4242 -ErrorAction SilentlyContinue")); + assert!(deferred.contains("if (-not $current) { break }")); + assert!( + deferred + .contains("if ($parentStart -and $current.StartTime -ne $parentStart) { break }") + ); assert!(deferred.contains("Start-Sleep -Milliseconds 100")); assert!( deferred.contains( @@ -13179,7 +13193,7 @@ mod tests { ) ); assert!( - deferred.find("Get-Process -Id 4242").unwrap() + deferred.find("$parentStart").unwrap() < deferred.find("irm 'https://git.palav.dev").unwrap() ); }