mirror of
https://github.com/git/git.git
synced 2026-08-03 22:51:13 +00:00
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 <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
e36cda7d7a
commit
9184231173
@@ -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);
|
||||
|
||||
@@ -159,6 +159,7 @@ static int exit_process(HANDLE process, int exit_code)
|
||||
return terminate_process_tree(process, exit_code);
|
||||
}
|
||||
|
||||
CloseHandle(process);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user