Chromium Code Reviews| Index: content/common/sandbox_linux/sandbox_linux.cc |
| diff --git a/content/common/sandbox_linux/sandbox_linux.cc b/content/common/sandbox_linux/sandbox_linux.cc |
| index 12e12fee0979cf07d1a5d483a072c3502fdb6578..5eee4e1d6c14d47e785a0ac42e4c8a77a93d6383 100644 |
| --- a/content/common/sandbox_linux/sandbox_linux.cc |
| +++ b/content/common/sandbox_linux/sandbox_linux.cc |
| @@ -76,22 +76,23 @@ bool IsRunningTSAN() { |
| #endif |
| } |
| -// Try to open /proc/self/task/ with the help of |proc_fd|. |proc_fd| can be |
| -// -1. Will return -1 on error and set errno like open(2). |
| +// Get a file descriptor to /proc. Either duplicate |proc_fd| or try to open |
| +// it by using the filesystem directly. |
| // TODO(jln): get rid of this ugly interface. |
|
jln (very slow on Chromium)
2015/02/24 01:45:38
This will be cleaned-up when refactoring how we st
|
| -int OpenProcTaskFd(int proc_fd) { |
| - int proc_self_task = -1; |
| +base::ScopedFD OpenProc(int proc_fd) { |
| + int ret_proc_fd = -1; |
| if (proc_fd >= 0) { |
| // If a handle to /proc is available, use it. This allows to bypass file |
| // system restrictions. |
| - proc_self_task = HANDLE_EINTR( |
| - openat(proc_fd, "self/task/", O_RDONLY | O_DIRECTORY | O_CLOEXEC)); |
| + ret_proc_fd = |
| + HANDLE_EINTR(openat(proc_fd, ".", O_RDONLY | O_DIRECTORY | O_CLOEXEC)); |
| } else { |
| // Otherwise, make an attempt to access the file system directly. |
| - proc_self_task = HANDLE_EINTR(openat(AT_FDCWD, "/proc/self/task/", |
| - O_RDONLY | O_DIRECTORY | O_CLOEXEC)); |
| + ret_proc_fd = HANDLE_EINTR( |
| + openat(AT_FDCWD, "/proc/", O_RDONLY | O_DIRECTORY | O_CLOEXEC)); |
| } |
| - return proc_self_task; |
| + DCHECK_LE(0, ret_proc_fd); |
| + return base::ScopedFD(ret_proc_fd); |
| } |
| } // namespace |
| @@ -183,11 +184,9 @@ void LinuxSandbox::EngageNamespaceSandbox() { |
| CHECK(sandbox::Credentials::MoveToNewUserNS()); |
| // Note: this requires SealSandbox() to be called later in this process to be |
| - // safe, as this class is keeping a file descriptor to /proc. |
| - CHECK(!HasOpenDirectories()); |
| - CHECK(sandbox::Credentials::DropFileSystemAccess()); |
| - CHECK(IsSingleThreaded()); |
| - CHECK(sandbox::Credentials::DropAllCapabilities()); |
| + // safe, as this class is keeping a file descriptor to /proc/. |
| + CHECK(sandbox::Credentials::DropFileSystemAccess(proc_fd_)); |
| + CHECK(sandbox::Credentials::DropAllCapabilities(proc_fd_)); |
| // This needs to happen after moving to a new user NS, since doing so involves |
| // writing the UID/GID map. |
| @@ -257,14 +256,13 @@ int LinuxSandbox::GetStatus() { |
| // PID namespaces and existing sandboxes, so "self" must really be used instead |
| // of using the pid. |
| bool LinuxSandbox::IsSingleThreaded() const { |
| - base::ScopedFD proc_self_task(OpenProcTaskFd(proc_fd_)); |
| + base::ScopedFD proc_fd(OpenProc(proc_fd_)); |
| - CHECK(proc_self_task.is_valid()) |
| - << "Could not count threads, the sandbox was not " |
| - << "pre-initialized properly."; |
| + CHECK(proc_fd.is_valid()) << "Could not count threads, the sandbox was not " |
| + << "pre-initialized properly."; |
| const bool is_single_threaded = |
| - sandbox::ThreadHelpers::IsSingleThreaded(proc_self_task.get()); |
| + sandbox::ThreadHelpers::IsSingleThreaded(proc_fd.get()); |
| return is_single_threaded; |
| } |
| @@ -283,9 +281,8 @@ bool LinuxSandbox::StartSeccompBPF(const std::string& process_type) { |
| CHECK(!seccomp_bpf_started_); |
| CHECK(pre_initialized_); |
| if (seccomp_bpf_supported()) { |
| - base::ScopedFD proc_self_task(OpenProcTaskFd(proc_fd_)); |
| seccomp_bpf_started_ = |
| - SandboxSeccompBPF::StartSandbox(process_type, proc_self_task.Pass()); |
| + SandboxSeccompBPF::StartSandbox(process_type, OpenProc(proc_fd_)); |
| } |
| if (seccomp_bpf_started_) { |
| @@ -452,10 +449,10 @@ void LinuxSandbox::CheckForBrokenPromises(const std::string& process_type) { |
| void LinuxSandbox::StopThreadAndEnsureNotCounted(base::Thread* thread) const { |
| DCHECK(thread); |
| - base::ScopedFD proc_self_task(OpenProcTaskFd(proc_fd_)); |
| - PCHECK(proc_self_task.is_valid()); |
| - CHECK(sandbox::ThreadHelpers::StopThreadAndWatchProcFS(proc_self_task.get(), |
| - thread)); |
| + base::ScopedFD proc_fd(OpenProc(proc_fd_)); |
| + PCHECK(proc_fd.is_valid()); |
| + CHECK( |
| + sandbox::ThreadHelpers::StopThreadAndWatchProcFS(proc_fd.get(), thread)); |
| } |
| } // namespace content |