Eryk Sun <[email protected]> added the comment:
> OSError: [WinError 87] The parameter is incorrect
This error didn't originate from the C dup() call, since that would be based on
errno, like `OSError: [Errno 9] Bad file descriptor`. It must come from
_Py_set_inheritable. The only WINAPI call there is SetHandleInformation [1],
which is documented to support "console input buffer" and "console screen
buffer" handles, though it may be that the documentation is wrong.
Try the following code:
>>> import os, msvcrt
>>> msvcrt.get_osfhandle(0)
84
>>> os.set_handle_inheritable(msvcrt.get_osfhandle(0), False)
Prior to Windows 8, a console handle is tagged by setting the lower 2 bits
(e.g. 3, 7, 11). The system uses this tag to direct calls to special console
functions that route requests over the console LPC port. Thus, in the domain of
File handles, setting the lower 2 bits is reserved to tag console handles. This
should also be true in Windows 8+, even though console handle tagging is no
longer used (now they're kernel handles for the ConDrv device).
The above test will confirm my suspicion, but it looks some time around Windows
XP/2003, Microsoft removed the internal [Get|Set]ConsoleHandleInformation
functions that used to implement [Get|Set]HandleInformation for console
handles, and the people responsible for the change failed to update the docs.
Since the internal DuplicateConsoleHandle function wasn't removed, dup() itself
still succeeds.
I suggest that _Py_set_inheritable should handle this case. If the call fails
with ERROR_INVALID_PARAMETER, and the two tag bits of the handle are set, the
handle is possibly (not necessarily) a console handle. In this case, if
GetFileType is FILE_TYPE_CHARACTER, then it's a console handle, and the error
should be ignored.
[1]
https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-sethandleinformation
----------
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue37549>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com