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