Eryk Sun <eryk...@gmail.com> added the comment:

> Python 3.7 added the support for the PROC_THREAD_ATTRIBUTE_HANDLE_LIST 
> in subprocess.STARTUPINFO: lpAttributeList['handle_list'] parameter.

The motivating reason to add support for the WinAPI handle list was to allow 
changing the default to close_fds=True regardless of the need to inherit 
standard handles. However, even when using the handle list, one still has to 
make each handle in the list inheritable. Thus concurrent calls to os.system() 
and os.spawn*() -- which are not implemented via subprocess.Popen(), but should 
be -- may leak the handles in the list. If the default is changed to 
close_fds=False, then by default concurrent Popen() calls may also leak 
temporarily inheritable handles when a handle list isn't used to constrain 
inheritance.

Background

Windows implicitly duplicates standard I/O handles from a parent process to a 
child process if they're both console applications and the child inherits the 
console session. However, subprocess.Popen() requires standard I/O inheritance 
to work consistently even without an inherited console session. It explicitly 
inherits standard handles in the STARTUPINFO record, which requires 
CreateProcessW to be called with bInheritHandles as TRUE. In 3.7+, Popen() also 
passes the standard-handle values in a PROC_THREAD_ATTRIBUTE_HANDLE_LIST 
attribute that constrains inheritance, but handles in the list still have to be 
made inheritable before calling CreateProcessW. Thus they may be leaked by 
concurrent CreateProcessW calls that inherit handles without a constraining 
handle list.

----------
nosy: +eryksun

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue42738>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to