From 789994012c26fcaa92891c986bd82d132e632d75 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Fri, 22 Oct 2010 03:09:55 -0700 Subject: [PATCH] EbuildFetcher: close uneeded fds in subprocess --- pym/_emerge/EbuildFetcher.py | 11 +---------- pym/portage/process.py | 35 +++++++++++++++++++---------------- 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/pym/_emerge/EbuildFetcher.py b/pym/_emerge/EbuildFetcher.py index 9f48d21f5..7b2cdb948 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 -- 2.26.2