From 4506c528cadfee206d808b1b982b5291e5591fbf Mon Sep 17 00:00:00 2001 From: David Wilson Date: Sun, 10 Feb 2019 22:32:57 +0000 Subject: [PATCH] issue #481: add test. --- tests/data/stubs/stub-sudo.py | 13 +++++++++---- tests/sudo_test.py | 9 +++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/tests/data/stubs/stub-sudo.py b/tests/data/stubs/stub-sudo.py index a7f2704f..71364df7 100755 --- a/tests/data/stubs/stub-sudo.py +++ b/tests/data/stubs/stub-sudo.py @@ -8,7 +8,12 @@ import sys os.environ['ORIGINAL_ARGV'] = json.dumps(sys.argv) os.environ['THIS_IS_STUB_SUDO'] = '1' -# This must be a child process and not exec() since Mitogen replaces its stderr -# descriptor, causing the last user of the slave PTY to close it, resulting in -# the master side indicating EIO. -subprocess.check_call(sys.argv[sys.argv.index('--') + 1:]) +if os.environ.get('PREHISTORIC_SUDO'): + # issue #481: old versions of sudo did in fact use execve, thus we must + # have TTY handle preservation in core.py. + os.execv(sys.executable, sys.argv[sys.argv.index('--') + 1:]) +else: + # This must be a child process and not exec() since Mitogen replaces its + # stderr descriptor, causing the last user of the slave PTY to close it, + # resulting in the master side indicating EIO. + subprocess.check_call(sys.argv[sys.argv.index('--') + 1:]) diff --git a/tests/sudo_test.py b/tests/sudo_test.py index 5bf9f4de..1d10ba9a 100644 --- a/tests/sudo_test.py +++ b/tests/sudo_test.py @@ -55,6 +55,15 @@ class ConstructorTest(testlib.RouterMixin, testlib.TestCase): '--' ]) + def test_tty_preserved(self): + # issue #481 + os.environ['PREHISTORIC_SUDO'] = '1' + try: + context, argv = self.run_sudo() + self.assertEquals('1', context.call(os.getenv, 'PREHISTORIC_SUDO')) + finally: + del os.environ['PREHISTORIC_SUDO'] + class NonEnglishPromptTest(testlib.DockerMixin, testlib.TestCase): # Only mitogen/debian-test has a properly configured sudo.