Eryk Sun <eryk...@gmail.com> 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 <rep...@bugs.python.org>
<https://bugs.python.org/issue37549>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to