]> git.99rst.org Git - git.git/commit
mingw: make `exit_process()` own the process handle on all paths
authorJohannes Schindelin <redacted>
Sun, 5 Jul 2026 08:24:29 +0000 (08:24 +0000)
committerJunio C Hamano <redacted>
Sun, 5 Jul 2026 16:12:10 +0000 (09:12 -0700)
commit9184231173dea25e922a0ee6ced938c57bca37e5
tree67bb64de377a4c165ae6a325bf8c26b90fc8ca26
parente36cda7d7ab1cbd2a096913777d382182872c8db
mingw: make `exit_process()` own the process handle on all paths

After "mingw: kill child processes in a gentler way", the ownership of
the HANDLE passed to `exit_process()` and `terminate_process_tree()` is
inconsistent. `terminate_process_tree()` always closes the handle;
`exit_process()` closes it on success and on the terminate-tree
fallback, but leaks it on the early return where GetExitCodeProcess()
fails or reports the process is no longer STILL_ACTIVE.

`mingw_kill()` compensated by closing the handle on its own error path,
which is a double-close on every error path that does not hit that one
leaky branch -- the callee has already closed the handle by then.
Coverity flagged the resulting use-after-free as CID 1437238.

Pin down the invariant that `exit_process()` and
`terminate_process_tree()` own the handle from the call onward and close
it on every return path; with that, the bogus close in `mingw_kill()`
goes away.

Assisted-by: Opus 4.7
Signed-off-by: Johannes Schindelin <redacted>
Signed-off-by: Junio C Hamano <redacted>
compat/mingw.c
compat/win32/exit-process.h
git clone https://git.99rst.org/PROJECT