Commit c223c6cb authored by Gregory P. Smith's avatar Gregory P. Smith

backport r60104 + r60111 from trunk.

- Issue #1336: fix a race condition in subprocess.Popen if the garbage
  collector kicked in at the wrong time that would cause the process
  to hang when the child wrote to stderr.
parent af81c576
......@@ -358,6 +358,7 @@ mswindows = (sys.platform == "win32")
import os
import types
import traceback
import gc
# Exception classes used by this module.
class CalledProcessError(Exception):
......@@ -1002,7 +1003,16 @@ class Popen(object):
errpipe_read, errpipe_write = os.pipe()
self._set_cloexec_flag(errpipe_write)
self.pid = os.fork()
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = os.fork()
except:
if gc_was_enabled:
gc.enable()
raise
self._child_created = True
if self.pid == 0:
# Child
......@@ -1062,6 +1072,8 @@ class Popen(object):
os._exit(255)
# Parent
if gc_was_enabled:
gc.enable()
os.close(errpipe_write)
if p2cread and p2cwrite:
os.close(p2cread)
......
......@@ -53,6 +53,10 @@ Core and builtins
Library
-------
- Issue #1336: fix a race condition in subprocess.Popen if the garbage
collector kicked in at the wrong time that would cause the process
to hang when the child wrote to stderr.
- Bug #1687: Fixed plistlib.py restricts <integer> to Python int when writing.
- Issue #1182: many arithmetic bugs in the decimal module have been
......
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