gh-58689: Fix os.kill() error handling on Windows (#128932)

This commit is contained in:
Victor Stinner 2025-01-17 13:30:40 +01:00 committed by GitHub
parent 7807b40730
commit 939df0f9f6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -9582,42 +9582,33 @@ os_kill_impl(PyObject *module, pid_t pid, Py_ssize_t signal)
Py_RETURN_NONE;
#else /* !MS_WINDOWS */
PyObject *result;
DWORD sig = (DWORD)signal;
DWORD err;
HANDLE handle;
#ifdef HAVE_WINDOWS_CONSOLE_IO
/* Console processes which share a common console can be sent CTRL+C or
CTRL+BREAK events, provided they handle said events. */
if (sig == CTRL_C_EVENT || sig == CTRL_BREAK_EVENT) {
if (GenerateConsoleCtrlEvent(sig, (DWORD)pid) == 0) {
err = GetLastError();
PyErr_SetFromWindowsErr(err);
}
else {
Py_RETURN_NONE;
return PyErr_SetFromWindowsErr(0);
}
Py_RETURN_NONE;
}
#endif /* HAVE_WINDOWS_CONSOLE_IO */
/* If the signal is outside of what GenerateConsoleCtrlEvent can use,
attempt to open and terminate the process. */
handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, (DWORD)pid);
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, (DWORD)pid);
if (handle == NULL) {
err = GetLastError();
return PyErr_SetFromWindowsErr(err);
}
if (TerminateProcess(handle, sig) == 0) {
err = GetLastError();
result = PyErr_SetFromWindowsErr(err);
} else {
result = Py_NewRef(Py_None);
return PyErr_SetFromWindowsErr(0);
}
BOOL res = TerminateProcess(handle, sig);
CloseHandle(handle);
return result;
if (res == 0) {
return PyErr_SetFromWindowsErr(0);
}
Py_RETURN_NONE;
#endif /* !MS_WINDOWS */
}
#endif /* HAVE_KILL */