Index: components/nacl/loader/sandbox_linux/nacl_sandbox_linux.cc |
diff --git a/components/nacl/loader/sandbox_linux/nacl_sandbox_linux.cc b/components/nacl/loader/sandbox_linux/nacl_sandbox_linux.cc |
index 1914116c4b3dd7f3e569e26b103428429741960f..95c02a05e8275b4b3736583a9f34c3e45180cb43 100644 |
--- a/components/nacl/loader/sandbox_linux/nacl_sandbox_linux.cc |
+++ b/components/nacl/loader/sandbox_linux/nacl_sandbox_linux.cc |
@@ -14,6 +14,7 @@ |
#include "base/callback.h" |
#include "base/command_line.h" |
#include "base/compiler_specific.h" |
+#include "base/files/scoped_file.h" |
#include "base/logging.h" |
#include "base/memory/scoped_ptr.h" |
#include "base/posix/eintr_wrapper.h" |
@@ -21,6 +22,7 @@ |
#include "components/nacl/common/nacl_switches.h" |
#include "components/nacl/loader/nonsfi/nonsfi_sandbox.h" |
#include "components/nacl/loader/sandbox_linux/nacl_bpf_sandbox_linux.h" |
+#include "sandbox/linux/seccomp-bpf/sandbox_bpf.h" |
#include "sandbox/linux/services/credentials.h" |
#include "sandbox/linux/services/thread_helpers.h" |
#include "sandbox/linux/suid/client/setuid_sandbox_client.h" |
@@ -39,6 +41,15 @@ bool IsSandboxed() { |
return true; |
} |
+// Open a new file descriptor to /proc/self/task/ by using |
+// |proc_fd|. |
+base::ScopedFD GetProcSelfTask(int proc_fd) { |
+ base::ScopedFD proc_self_task(HANDLE_EINTR( |
+ openat(proc_fd, "self/task/", O_RDONLY | O_DIRECTORY | O_CLOEXEC))); |
+ PCHECK(proc_self_task.is_valid()); |
+ return proc_self_task.Pass(); |
+} |
+ |
} // namespace |
NaClSandbox::NaClSandbox() |
@@ -51,6 +62,9 @@ NaClSandbox::NaClSandbox() |
proc_fd_.reset( |
HANDLE_EINTR(open("/proc", O_DIRECTORY | O_RDONLY | O_CLOEXEC))); |
PCHECK(proc_fd_.is_valid()); |
+ // Determine if the kernel supports seccomp-bpf and let it cache the |
+ // result. This must be done before any sandbox is engaged. |
+ sandbox::SandboxBPF::SupportsSeccompSandbox(); |
} |
NaClSandbox::~NaClSandbox() { |
@@ -58,9 +72,7 @@ NaClSandbox::~NaClSandbox() { |
bool NaClSandbox::IsSingleThreaded() { |
CHECK(proc_fd_.is_valid()); |
- base::ScopedFD proc_self_task(HANDLE_EINTR(openat( |
- proc_fd_.get(), "self/task/", O_RDONLY | O_DIRECTORY | O_CLOEXEC))); |
- PCHECK(proc_self_task.is_valid()); |
+ base::ScopedFD proc_self_task(GetProcSelfTask(proc_fd_.get())); |
return sandbox::ThreadHelpers::IsSingleThreaded(proc_self_task.get()); |
} |
@@ -114,11 +126,14 @@ void NaClSandbox::InitializeLayerTwoSandbox(bool uses_nonsfi_mode) { |
CHECK(IsSingleThreaded()); |
CheckForExpectedNumberOfOpenFds(); |
+ base::ScopedFD proc_self_task(GetProcSelfTask(proc_fd_.get())); |
+ |
if (uses_nonsfi_mode) { |
- layer_two_enabled_ = nacl::nonsfi::InitializeBPFSandbox(); |
+ layer_two_enabled_ = |
+ nacl::nonsfi::InitializeBPFSandbox(proc_self_task.Pass()); |
layer_two_is_nonsfi_ = true; |
} else { |
- layer_two_enabled_ = nacl::InitializeBPFSandbox(); |
+ layer_two_enabled_ = nacl::InitializeBPFSandbox(proc_self_task.Pass()); |
} |
} |