| # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| |
| import os |
| import subprocess |
| |
| from autotest_lib.client.bin import test, utils |
| from autotest_lib.client.common_lib import error |
| |
| class security_RendererSandbox(test.test): |
| version = 1 |
| renderer_pid = -1 |
| |
| |
| def _get_renderer_pid(self): |
| """Query pgrep for the pid of the renderer. Since this function is |
| passed as an argument to |utils.poll_for_condition()|, the return values |
| are set to True/False depending on whether a pid has been found.""" |
| |
| pgrep = subprocess.Popen(['pgrep', '-f', '-l', 'type=renderer'], |
| stdout=subprocess.PIPE) |
| procs = pgrep.communicate()[0].splitlines() |
| pids = [] |
| # The fix for http://code.google.com/p/chromium/issues/detail?id=129884 |
| # adds '--ignored= --type=renderer' to the GPU process cmdline. |
| # This makes 'pgrep' above return the pid of the GPU process, |
| # which is not setuid sandboxed, as the pid of a renderer, |
| # breaking the test. |
| # Work around by removing processes with '--ignored= --type=renderer' |
| # flags. |
| for proc in procs: |
| if '--ignored= --type=renderer' not in proc: |
| pids.append(proc.split()[0]) |
| |
| if pids: |
| self.renderer_pid = pids[0] |
| return True |
| else: |
| return False |
| |
| |
| def _check_for_suid_sandbox(self, renderer_pid): |
| """For the setuid sandbox, make sure there is no content in the CWD |
| directory.""" |
| |
| cwd_contents = os.listdir('/proc/%s/cwd' % self.renderer_pid) |
| if len(cwd_contents) > 0: |
| raise error.TestFail('Contents present in the CWD directory') |
| |
| |
| def run_once(self, time_to_wait=20): |
| """Wait until the page is loaded and poll for the renderer pid. |
| If renderer pid is found, it is stored in |self.renderer_pid|.""" |
| |
| utils.poll_for_condition( |
| self._get_renderer_pid, |
| error.TestFail('Timed out waiting to obtain pid of renderer'), |
| time_to_wait) |
| |
| # Check if renderer is sandboxed. |
| self._check_for_suid_sandbox(self.renderer_pid) |