From: Gregory P. Smith Date: Sat, 19 Jan 2008 22:29:41 +0000 (+0000) Subject: backport r60104 + r60111 from trunk. X-Git-Tag: v2.5.2c1~67 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c223c6cb413880842bf396153c237dd7f6eb619c;p=python 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. --- diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 5b6fb18289..094ca1ba88 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -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) diff --git a/Misc/NEWS b/Misc/NEWS index 08181e6047..294ab87282 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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 to Python int when writing. - Issue #1182: many arithmetic bugs in the decimal module have been