Skip to content

Commit

Permalink
pythongh-58689: Fix os.kill() error handling on Windows (python#128932)
Browse files Browse the repository at this point in the history
  • Loading branch information
vstinner authored and srinivasreddy committed Jan 21, 2025
1 parent f12e00e commit 5c4cbf1
Showing 1 changed file with 9 additions and 18 deletions.
27 changes: 9 additions & 18 deletions Modules/posixmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
return PyErr_SetFromWindowsErr(0);
}

if (TerminateProcess(handle, sig) == 0) {
err = GetLastError();
result = PyErr_SetFromWindowsErr(err);
} else {
result = Py_NewRef(Py_None);
BOOL res = TerminateProcess(handle, sig);
CloseHandle(handle);
if (res == 0) {
return PyErr_SetFromWindowsErr(0);
}

CloseHandle(handle);
return result;
Py_RETURN_NONE;
#endif /* !MS_WINDOWS */
}
#endif /* HAVE_KILL */
Expand Down

0 comments on commit 5c4cbf1

Please sign in to comment.