Commit bd7b5dd8 authored by Richard Oudkerk's avatar Richard Oudkerk

Prevent handle leak if CreateProcess() fails in multiprocessing

parent 86eb7e97
...@@ -209,6 +209,9 @@ else: ...@@ -209,6 +209,9 @@ else:
_tls = _thread._local() _tls = _thread._local()
def __init__(self, process_obj): def __init__(self, process_obj):
cmd = ' '.join('"%s"' % x for x in get_command_line())
prep_data = get_preparation_data(process_obj._name)
# create pipe for communication with child # create pipe for communication with child
rfd, wfd = os.pipe() rfd, wfd = os.pipe()
...@@ -216,31 +219,30 @@ else: ...@@ -216,31 +219,30 @@ else:
rhandle = duplicate(msvcrt.get_osfhandle(rfd), inheritable=True) rhandle = duplicate(msvcrt.get_osfhandle(rfd), inheritable=True)
os.close(rfd) os.close(rfd)
# start process with open(wfd, 'wb', closefd=True) as to_child:
cmd = get_command_line() + [rhandle] # start process
cmd = ' '.join('"%s"' % x for x in cmd) try:
hp, ht, pid, tid = _winapi.CreateProcess( hp, ht, pid, tid = _winapi.CreateProcess(
_python_exe, cmd, None, None, 1, 0, None, None, None _python_exe, cmd + (' %s' % rhandle),
) None, None, 1, 0, None, None, None
_winapi.CloseHandle(ht) )
close(rhandle) _winapi.CloseHandle(ht)
finally:
# set attributes of self close(rhandle)
self.pid = pid
self.returncode = None # set attributes of self
self._handle = hp self.pid = pid
self.sentinel = int(hp) self.returncode = None
self._handle = hp
# send information to child self.sentinel = int(hp)
prep_data = get_preparation_data(process_obj._name)
to_child = os.fdopen(wfd, 'wb') # send information to child
Popen._tls.process_handle = int(hp) Popen._tls.process_handle = int(hp)
try: try:
dump(prep_data, to_child, HIGHEST_PROTOCOL) dump(prep_data, to_child, HIGHEST_PROTOCOL)
dump(process_obj, to_child, HIGHEST_PROTOCOL) dump(process_obj, to_child, HIGHEST_PROTOCOL)
finally: finally:
del Popen._tls.process_handle del Popen._tls.process_handle
to_child.close()
@staticmethod @staticmethod
def thread_is_spawning(): def thread_is_spawning():
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment