mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
bpo-33929: multiprocessing: fix handle leak on race condition (GH-7921)
Fix a race condition in Popen of multiprocessing.popen_spawn_win32. The child process now duplicates the read end of pipe instead of "stealing" it. Previously, the read end of pipe was "stolen" by the child process, but it leaked a handle if the child process had been terminated before it could steal the handle from the parent process.
This commit is contained in:
parent
f15f66d275
commit
2cc9d21fff
4 changed files with 34 additions and 6 deletions
|
@ -68,12 +68,16 @@ if sys.platform == 'win32':
|
|||
__all__ += ['DupHandle', 'duplicate', 'steal_handle']
|
||||
import _winapi
|
||||
|
||||
def duplicate(handle, target_process=None, inheritable=False):
|
||||
def duplicate(handle, target_process=None, inheritable=False,
|
||||
*, source_process=None):
|
||||
'''Duplicate a handle. (target_process is a handle not a pid!)'''
|
||||
current_process = _winapi.GetCurrentProcess()
|
||||
if source_process is None:
|
||||
source_process = current_process
|
||||
if target_process is None:
|
||||
target_process = _winapi.GetCurrentProcess()
|
||||
target_process = current_process
|
||||
return _winapi.DuplicateHandle(
|
||||
_winapi.GetCurrentProcess(), handle, target_process,
|
||||
source_process, handle, target_process,
|
||||
0, inheritable, _winapi.DUPLICATE_SAME_ACCESS)
|
||||
|
||||
def steal_handle(source_pid, handle):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue