diff --git a/tests/unit/test_bubblewrap.py b/tests/unit/test_bubblewrap.py index b274944a95..1928222d90 100644 --- a/tests/unit/test_bubblewrap.py +++ b/tests/unit/test_bubblewrap.py @@ -15,6 +15,7 @@ import logging import subprocess import tempfile import testtools +import os from zuul.driver import bubblewrap from zuul.executor.server import SshAgent @@ -52,3 +53,23 @@ class TestBubblewrap(testtools.TestCase): # Make sure the _r's are closed self.assertIsNone(po.passwd_r) self.assertIsNone(po.group_r) + + def test_bubblewrap_leak(self): + bwrap = bubblewrap.BubblewrapDriver() + work_dir = tempfile.mkdtemp() + ansible_dir = tempfile.mkdtemp() + ssh_agent = SshAgent() + self.addCleanup(ssh_agent.stop) + ssh_agent.start() + po = bwrap.getPopen(work_dir=work_dir, + ansible_dir=ansible_dir, + ssh_auth_sock=ssh_agent.env['SSH_AUTH_SOCK']) + leak_time = 7 + # Use hexadecimal notation to avoid false-positive + true_proc = po(['bash', '-c', 'sleep 0x%X & disown' % leak_time]) + self.assertEqual(0, true_proc.wait()) + cmdline = "sleep\x000x%X\x00" % leak_time + sleep_proc = [pid for pid in os.listdir("/proc") if + os.path.isfile("/proc/%s/cmdline" % pid) and + open("/proc/%s/cmdline" % pid).read() == cmdline] + self.assertEqual(len(sleep_proc), 0, "Processes leaked") diff --git a/zuul/driver/bubblewrap/__init__.py b/zuul/driver/bubblewrap/__init__.py index e3a9866113..580aaf9499 100644 --- a/zuul/driver/bubblewrap/__init__.py +++ b/zuul/driver/bubblewrap/__init__.py @@ -93,6 +93,7 @@ class BubblewrapDriver(Driver, WrapperInterface): '--chdir', '{work_dir}', '--unshare-all', '--share-net', + '--die-with-parent', '--uid', '{uid}', '--gid', '{gid}', '--file', '{uid_fd}', '/etc/passwd',