]> git.ipfire.org Git - thirdparty/git.git/commitdiff
mingw: make `exit_process()` own the process handle on all paths
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Sun, 5 Jul 2026 08:24:29 +0000 (08:24 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sun, 5 Jul 2026 16:12:10 +0000 (09:12 -0700)
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 <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
compat/mingw.c
compat/win32/exit-process.h

index 41e055f7de885e14d4d1af423e764353ea329f7e..e2cb92a4144b36ddf4ab79eea3516e35d05573d0 100644 (file)
@@ -2269,10 +2269,8 @@ int mingw_kill(pid_t pid, int sig)
                        }
                        ret = terminate_process_tree(h, 128 + sig);
                }
-               if (ret) {
+               if (ret)
                        errno = err_win_to_posix(GetLastError());
-                       CloseHandle(h);
-               }
                return ret;
        } else if (pid > 0 && sig == 0) {
                HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
index d53989884cfb0cedf14843fba2ddc378a5dcb057..26004161bcbdc37f4dcb439da800da1e3aea5356 100644 (file)
@@ -159,6 +159,7 @@ static int exit_process(HANDLE process, int exit_code)
                return terminate_process_tree(process, exit_code);
        }
 
+       CloseHandle(process);
        return 0;
 }