From 7bf4a999ef457ee26252eae6a0cd3524ad1831ce Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Fri, 24 May 2024 11:27:46 -0600 Subject: [PATCH] fix: truncate lock file Truncate it after successful locks and before an unlock. This makes sure that we aren't left with garbage from previous runs. Signed-off-by: Rudi Grinberg --- doc/changes/10575.md | 2 ++ src/dune_util/global_lock.ml | 20 ++++++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 doc/changes/10575.md diff --git a/doc/changes/10575.md b/doc/changes/10575.md new file mode 100644 index 00000000000..bd39ca7bb7c --- /dev/null +++ b/doc/changes/10575.md @@ -0,0 +1,2 @@ +- Make sure to truncate dune's lock file after locking and unlocking so that + users cannot observe incorrect pid's (#10575, @rgrinberg) diff --git a/src/dune_util/global_lock.ml b/src/dune_util/global_lock.ml index b071258bafb..04b2de815f2 100644 --- a/src/dune_util/global_lock.ml +++ b/src/dune_util/global_lock.ml @@ -52,11 +52,16 @@ module Lock = struct | `Failure -> () | `Success -> let fd = Flock.fd t in + Unix.ftruncate fd 0; write_pid fd); res ;; - let unlock () = Lazy.force t |> Flock.unlock |> or_raise_unix ~name:"unlock" + let unlock () = + let lock = Lazy.force t in + Unix.ftruncate (Flock.fd lock) 0; + Flock.unlock lock |> or_raise_unix ~name:"unlock" + ;; end let locked = ref false @@ -95,11 +100,10 @@ let lock_exn ~timeout = ;; let unlock () = - match Config.(get global_lock) with - | `Disabled -> () - | `Enabled -> - if !locked - then ( - Lock.unlock (); - locked := false) + if !locked + then ( + Lock.unlock (); + locked := false) ;; + +let () = at_exit unlock