New submission from STINNER Victor <vstin...@python.org>:
On Windows, the exit code is a 32-bit value. It may or may not signed depending on the function. Unsigned in the Windows native API: BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode); BOOL GetExitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode); Signed in the POSIX API: intptr_t _cwait(int *termstat, intptr_t procHandle, int action); Problem: os.waitpid() uses "status << 8" which can overflow; status is an int. static PyObject * os_waitpid_impl(PyObject *module, intptr_t pid, int options) { int status; (...) /* shift the status left a byte so this is more like the POSIX waitpid */ return Py_BuildValue(_Py_PARSE_INTPTR "i", res, status << 8); } int64_t or uint64_t should be used, or a Python object should be used, to avoid the overflow. I just added os.waitstatus_to_exitcode() in bpo-40094 which simply does "status >> 8" on Windows. Currently, this function casts the argument to a C int and so is limited to INT_MAX. It should also be adapted to handle values larger than INT_MAX. By the way, I'm not sure how to handle values larger than INT_MAX. The POSIX API of Windows uses a signed integer, and so convert such value as a negative value. But the native Windows API uses unsigned numbers. It seems like using unsigned number would be better. -- By the way, currently os.waitstatus_to_exitcode() ignores the lower 8 bits of the status. Maybe it should raise an error if lower 8 bits are not zero, and maybe also raise an exception if the number is negative? -- See also interesting comments by Eryk Sun in bpo-40094 about this problem. ---------- components: Library (Lib) messages: 365498 nosy: vstinner priority: normal severity: normal status: open title: Windows implementation of os.waitpid() truncates the exit status (status << 8) versions: Python 3.9 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue40138> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com