From 33bd7f8e97f165fb2f1e4ff93e2ababbe7c51679 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Sun, 6 Dec 2009 11:00:34 +0000 Subject: [PATCH] Bug #162404 - Automatically disable logging if sesandbox is enabled and a pty is not available for some reason (currently they are never available with python3). (trunk r14928) svn path=/main/branches/2.1.7/; revision=14942 --- pym/_emerge/EbuildProcess.py | 7 +++++++ pym/_emerge/SpawnProcess.py | 8 +++++++- pym/portage/__init__.py | 19 ++++++++++++++++--- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/pym/_emerge/EbuildProcess.py b/pym/_emerge/EbuildProcess.py index 86a63282f..a6a0b362b 100644 --- a/pym/_emerge/EbuildProcess.py +++ b/pym/_emerge/EbuildProcess.py @@ -24,6 +24,13 @@ class EbuildProcess(SpawnProcess): portage._create_pty_or_pipe(copy_term_size=stdout_pipe) return (master_fd, slave_fd) + def _can_log(self, slave_fd): + # With sesandbox, logging works through a pty but not through a + # normal pipe. So, disable logging if ptys are broken. + # See Bug #162404. + return not ('sesandbox' in self.settings.features \ + and self.settings.selinux_enabled()) or os.isatty(slave_fd) + def _spawn(self, args, **kwargs): root_config = self.pkg.root_config diff --git a/pym/_emerge/SpawnProcess.py b/pym/_emerge/SpawnProcess.py index 1486e6773..67fb17e29 100644 --- a/pym/_emerge/SpawnProcess.py +++ b/pym/_emerge/SpawnProcess.py @@ -49,7 +49,6 @@ class SpawnProcess(SubProcess): if fd == sys.stderr.fileno(): sys.stderr.flush() - logfile = self.logfile self._files = self._files_dict() files = self._files @@ -57,6 +56,10 @@ class SpawnProcess(SubProcess): fcntl.fcntl(master_fd, fcntl.F_SETFL, fcntl.fcntl(master_fd, fcntl.F_GETFL) | os.O_NONBLOCK) + logfile = None + if self._can_log(slave_fd): + logfile = self.logfile + null_input = None fd_pipes_orig = fd_pipes.copy() if self.background: @@ -125,6 +128,9 @@ class SpawnProcess(SubProcess): self.pid = retval[0] portage.process.spawned_pids.remove(self.pid) + def _can_log(self, slave_fd): + return True + def _pipe(self, fd_pipes): """ @type fd_pipes: dict diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 9c8930ad6..62c4d3b36 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -4057,12 +4057,25 @@ def spawn(mystring, mysettings, debug=0, free=0, droppriv=0, sesandbox=0, fakero if 1 not in fd_pipes or 2 not in fd_pipes: raise ValueError(fd_pipes) + got_pty, master_fd, slave_fd = \ + _create_pty_or_pipe(copy_term_size=fd_pipes[1]) + + if not got_pty and 'sesandbox' in mysettings.features \ + and mysettings.selinux_enabled(): + # With sesandbox, logging works through a pty but not through a + # normal pipe. So, disable logging if ptys are broken. + # See Bug #162404. + logfile = None + os.close(master_fd) + master_fd = None + os.close(slave_fd) + slave_fd = None + + if logfile: + fd_pipes.setdefault(0, sys.stdin.fileno()) fd_pipes_orig = fd_pipes.copy() - got_pty, master_fd, slave_fd = \ - _create_pty_or_pipe(copy_term_size=fd_pipes_orig[1]) - # We must set non-blocking mode before we close the slave_fd # since otherwise the fcntl call can fail on FreeBSD (the child # process might have already exited and closed slave_fd so we -- 2.26.2