summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2010-10-22 03:09:55 -0700
committerZac Medico <zmedico@gentoo.org>2010-10-22 03:09:55 -0700
commit292a277974fe1223bfa956243ac1a2bde1e20c42 (patch)
tree0c79b154a176a1aee8928e6702fc43b34a7e1b44
parent1f001546a5ebd6fec50ce2d3ff07eace373acbf9 (diff)
downloadportage-292a277974fe1223bfa956243ac1a2bde1e20c42.tar.gz
portage-292a277974fe1223bfa956243ac1a2bde1e20c42.tar.bz2
portage-292a277974fe1223bfa956243ac1a2bde1e20c42.zip
EbuildFetcher: close uneeded fds in subprocess
-rw-r--r--pym/_emerge/EbuildFetcher.py11
-rw-r--r--pym/portage/process.py35
2 files changed, 20 insertions, 26 deletions
diff --git a/pym/_emerge/EbuildFetcher.py b/pym/_emerge/EbuildFetcher.py
index b1a10d900..1abe846d7 100644
--- a/pym/_emerge/EbuildFetcher.py
+++ b/pym/_emerge/EbuildFetcher.py
@@ -85,16 +85,7 @@ class EbuildFetcher(SpawnProcess):
portage.process.spawned_pids.append(pid)
return [pid]
- # Set up the command's pipes.
- my_fds = {}
- # To protect from cases where direct assignment could
- # clobber needed fds ({1:2, 2:1}) we first dupe the fds
- # into unused fds.
- for fd in fd_pipes:
- my_fds[fd] = os.dup(fd_pipes[fd])
- # Then assign them to what they should be.
- for fd in my_fds:
- os.dup2(my_fds[fd], fd)
+ portage.process._setup_pipes(fd_pipes)
# Force consistent color output, in case we are capturing fetch
# output through a normal pipe due to unavailability of ptys.
diff --git a/pym/portage/process.py b/pym/portage/process.py
index 37b482a0e..e4d1d9523 100644
--- a/pym/portage/process.py
+++ b/pym/portage/process.py
@@ -352,7 +352,25 @@ def _exec(binary, mycommand, opt_name, fd_pipes, env, gid, groups, uid, umask,
# Quiet killing of subprocesses by SIGPIPE (see bug #309001).
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
- # Set up the command's pipes.
+ _setup_pipes(fd_pipes)
+
+ # Set requested process permissions.
+ if gid:
+ os.setgid(gid)
+ if groups:
+ os.setgroups(groups)
+ if uid:
+ os.setuid(uid)
+ if umask:
+ os.umask(umask)
+ if pre_exec:
+ pre_exec()
+
+ # And switch to the new process.
+ os.execve(binary, myargs, env)
+
+def _setup_pipes(fd_pipes):
+ """Setup pipes for a forked process."""
my_fds = {}
# To protect from cases where direct assignment could
# clobber needed fds ({1:2, 2:1}) we first dupe the fds
@@ -371,21 +389,6 @@ def _exec(binary, mycommand, opt_name, fd_pipes, env, gid, groups, uid, umask,
except OSError:
pass
- # Set requested process permissions.
- if gid:
- os.setgid(gid)
- if groups:
- os.setgroups(groups)
- if uid:
- os.setuid(uid)
- if umask:
- os.umask(umask)
- if pre_exec:
- pre_exec()
-
- # And switch to the new process.
- os.execve(binary, myargs, env)
-
def find_binary(binary):
"""
Given a binary name, find the binary in PATH