New submission from STINNER Victor <[email protected]>:
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 <[email protected]>
<https://bugs.python.org/issue40138>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com