aboutsummaryrefslogtreecommitdiffstats
path: root/devel/scons
diff options
context:
space:
mode:
authorpgollucci <pgollucci@FreeBSD.org>2008-12-25 22:57:06 +0800
committerpgollucci <pgollucci@FreeBSD.org>2008-12-25 22:57:06 +0800
commitce03820ef8d10342f03b9ff8d5883f747954bcb8 (patch)
treeeb63b023c3738b2d00e6fc955d56cf1128fd56e4 /devel/scons
parentfc503b95d084442899c64877d82d15b6954d0fe0 (diff)
downloadfreebsd-ports-gnome-ce03820ef8d10342f03b9ff8d5883f747954bcb8.tar.gz
freebsd-ports-gnome-ce03820ef8d10342f03b9ff8d5883f747954bcb8.tar.zst
freebsd-ports-gnome-ce03820ef8d10342f03b9ff8d5883f747954bcb8.zip
Python's subprocess module has a race condition: Popen() constructor has a call to global "_cleanup()" function on whenever a Popen object gets created, and that call causes a check for all pending Popen objects whether their subprocess has exited - i.e. the poll() method is called for every active Popen object.
See http://bugs.python.org/issue1731717 for addition details SCon's compat/_scons_subprocess.py module is just a copy of a more recent stock Python subprocess.py modified so it will work with older Python versions. The attached patch will add locks around calls to Popen and change the compat module in a way that the subprocess module is always used, no matter if Python already ships one. The rationale behind this decision is that there are many Python versions in the wild with different Popen() race condition problems. PR: ports/128845 Submitted by: Steven Kreuzer <skreuzer@exit2shell.com> Approved by: araujo (mentor, implicit)
Diffstat (limited to 'devel/scons')
-rw-r--r--devel/scons/Makefile1
-rw-r--r--devel/scons/files/patch-engine-SCons-compat-__init__.py29
-rw-r--r--devel/scons/files/patch-engine-SCons-compat-_scons_subprocess.py33
3 files changed, 63 insertions, 0 deletions
diff --git a/devel/scons/Makefile b/devel/scons/Makefile
index 49eac104cf48..ea267cbb9adc 100644
--- a/devel/scons/Makefile
+++ b/devel/scons/Makefile
@@ -7,6 +7,7 @@
PORTNAME= scons
PORTVERSION= 1.2.0
+PORTREVISION= 1
CATEGORIES= devel python
MASTER_SITES= SF
diff --git a/devel/scons/files/patch-engine-SCons-compat-__init__.py b/devel/scons/files/patch-engine-SCons-compat-__init__.py
new file mode 100644
index 000000000000..647570112d25
--- /dev/null
+++ b/devel/scons/files/patch-engine-SCons-compat-__init__.py
@@ -0,0 +1,29 @@
+Index: engine/SCons/compat/__init__.py
+===================================================================
+--- engine/SCons/compat/__init__.py (revision 2695)
++++ engine/SCons/compat/__init__.py (working copy)
+@@ -167,11 +167,17 @@
+ del shlex
+ import_as('_scons_shlex', 'shlex')
+
+-try:
+- import subprocess
+-except ImportError:
+- # Pre-2.4 Python has no subprocess module.
+- import_as('_scons_subprocess', 'subprocess')
++#try:
++# import subprocess
++#except ImportError:
++# # Pre-2.4 Python has no subprocess module.
++# import_as('_scons_subprocess', 'subprocess')
++
++# Import subprocess unconditionally to avoid possible race conditions in
++# the official subprocess API. If there are API versions without known
++# problems, we can version-check and use the original subprocess module
++# in these cases.
++import_as('_scons_subprocess', 'subprocess')
+
+ import sys
+ try:
+
+
diff --git a/devel/scons/files/patch-engine-SCons-compat-_scons_subprocess.py b/devel/scons/files/patch-engine-SCons-compat-_scons_subprocess.py
new file mode 100644
index 000000000000..1e60040700ee
--- /dev/null
+++ b/devel/scons/files/patch-engine-SCons-compat-_scons_subprocess.py
@@ -0,0 +1,33 @@
+Index: engine/SCons/compat/_scons_subprocess.py
+===================================================================
+--- engine/SCons/compat/_scons_subprocess.py (revision 2695)
++++ engine/SCons/compat/_scons_subprocess.py (working copy)
+@@ -581,13 +581,19 @@
+ class object:
+ pass
+
++import thread
++lock = thread.allocate_lock()
++
+ class Popen(object):
+ def __init__(self, args, bufsize=0, executable=None,
+ stdin=None, stdout=None, stderr=None,
+ preexec_fn=None, close_fds=False, shell=False,
+ cwd=None, env=None, universal_newlines=False,
+ startupinfo=None, creationflags=0):
+- """Create new Popen instance."""
++ """Create new Popen instance.
++ Popen is not thread-safe and is therefore protected with a lock.
++ """
++ lock.acquire()
+ _cleanup()
+
+ self._child_created = False
+@@ -655,6 +661,7 @@
+ self.stderr = os.fdopen(errread, 'rU', bufsize)
+ else:
+ self.stderr = os.fdopen(errread, 'rb', bufsize)
++ lock.release()
+
+
+ def _translate_newlines(self, data):