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. |
-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 |