summaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorhidehiko <hidehiko@chromium.org>2015-05-15 02:29:58 -0700
committerCommit bot <commit-bot@chromium.org>2015-05-15 09:30:14 +0000
commit72c418b09bbf90505f54df2b76285650acd97960 (patch)
tree71e234775c8e84bd8634141b296279d96284c522 /components
parent7bd179d625b0d7422291c852c6f64b5580f2067d (diff)
downloadchromium_src-72c418b09bbf90505f54df2b76285650acd97960.zip
chromium_src-72c418b09bbf90505f54df2b76285650acd97960.tar.gz
chromium_src-72c418b09bbf90505f54df2b76285650acd97960.tar.bz2
Non-SFI mode: Build nacl_helper_nonsfi_unittests
This CL starts to build nacl_helper_nonsfi_unittests. The binary is not yet enabled to run on bots. It will be done in a following CL. TEST=Ran locally. Ran build bots. Ran build bots with editing configuration to include nacl_helper_nonsfi_unittests. BUG=358465 Review URL: https://codereview.chromium.org/1137553003 Cr-Commit-Position: refs/heads/master@{#330069}
Diffstat (limited to 'components')
-rw-r--r--components/nacl/loader/nonsfi/nonsfi_sandbox_unittest.cc118
-rw-r--r--components/nacl_helper_nonsfi_unittests.isolate18
-rw-r--r--components/nacl_nonsfi.gyp130
3 files changed, 250 insertions, 16 deletions
diff --git a/components/nacl/loader/nonsfi/nonsfi_sandbox_unittest.cc b/components/nacl/loader/nonsfi/nonsfi_sandbox_unittest.cc
index 98e95c2..bd4ab95 100644
--- a/components/nacl/loader/nonsfi/nonsfi_sandbox_unittest.cc
+++ b/components/nacl/loader/nonsfi/nonsfi_sandbox_unittest.cc
@@ -25,6 +25,7 @@
#include <time.h>
#include <unistd.h>
+#include "base/at_exit.h"
#include "base/bind.h"
#include "base/callback.h"
#include "base/compiler_specific.h"
@@ -42,6 +43,67 @@
#include "sandbox/linux/system_headers/linux_signal.h"
#include "sandbox/linux/system_headers/linux_syscalls.h"
+// These defines are for PNaCl toolchain build.
+#if !defined(F_DUPFD_CLOEXEC)
+#define F_DUPFD_CLOEXEC 1030
+#endif
+
+#if !defined(MAP_POPULATE)
+#define MAP_POPULATE 0x8000
+#endif
+
+#if !defined(PROT_GROWSDOWN)
+#define PROT_GROWSDOWN 0x01000000
+#endif
+
+#if !defined(CLOCK_MONOTONIC_RAW)
+#define CLOCK_MONOTONIC_RAW 4
+#endif
+
+#if !defined(AF_INET)
+#define AF_INET 2
+#endif
+
+#if defined(__i386__)
+
+#if !defined(SYS_SOCKET)
+#define SYS_SOCKET 1
+#endif
+
+#if !defined(SYS_BIND)
+#define SYS_BIND 2
+#endif
+
+#if !defined(SYS_CONNECT)
+#define SYS_CONNECT 3
+#endif
+
+#if !defined(SYS_LISTEN)
+#define SYS_LISTEN 4
+#endif
+
+#if !defined(SYS_ACCEPT)
+#define SYS_ACCEPT 5
+#endif
+
+#if !defined(SYS_GETSOCKNAME)
+#define SYS_GETSOCKNAME 6
+#endif
+
+#if !defined(SYS_GETPEERNAME)
+#define SYS_GETPEERNAME 7
+#endif
+
+#if !defined(SYS_SETSOCKOPT)
+#define SYS_SETSOCKOPT 14
+#endif
+
+#if !defined(SYS_GETSOCKOPT)
+#define SYS_GETSOCKOPT 15
+#endif
+
+#endif // defined(__i386__)
+
namespace {
void DoPipe(base::ScopedFD* fds) {
@@ -368,18 +430,28 @@ BPF_DEATH_TEST_C(NaClNonSfiSandboxTest,
fcntl(fds[0].get(), F_SETFL, O_APPEND);
}
+void DoFcntl(int fd, int cmd) {
+ // fcntl in PNaCl toolchain returns an error without calling actual system
+ // call for unknown |cmd|. So, instead, here we use syscall().
+#if defined(OS_NACL_NONSFI)
+ syscall(__NR_fcntl64, fd, cmd);
+#else
+ fcntl(fd, cmd);
+#endif
+}
+
BPF_DEATH_TEST_C(NaClNonSfiSandboxTest,
fcntl_DUPFD,
DEATH_SEGV_MESSAGE(sandbox::GetErrorMessageContentForTests()),
nacl::nonsfi::NaClNonSfiBPFSandboxPolicy) {
- fcntl(0, F_DUPFD);
+ DoFcntl(0, F_DUPFD);
}
BPF_DEATH_TEST_C(NaClNonSfiSandboxTest,
fcntl_DUPFD_CLOEXEC,
DEATH_SEGV_MESSAGE(sandbox::GetErrorMessageContentForTests()),
nacl::nonsfi::NaClNonSfiBPFSandboxPolicy) {
- fcntl(0, F_DUPFD_CLOEXEC);
+ DoFcntl(0, F_DUPFD_CLOEXEC);
}
BPF_DEATH_TEST_C(NaClNonSfiSandboxTest,
@@ -403,6 +475,14 @@ BPF_DEATH_TEST_C(NaClNonSfiSandboxTest,
BPF_TEST_C(NaClNonSfiSandboxTest,
StartingAndJoiningThreadWorks,
nacl::nonsfi::NaClNonSfiBPFSandboxPolicy) {
+#if defined(OS_NACL_NONSFI)
+ // base::Thread internally uses LazyInstance, which registers a callback to
+ // AtExitManager. However, in PNaCl toolchain build, it is not instantiated
+ // by the test runner, unlike host toolchain build (nacl_loader_unittests).
+ // Hence, declare it here so that the LazyInstance will work properly.
+ base::AtExitManager at_exit;
+#endif
+
base::Thread thread("sandbox_tests");
BPF_ASSERT(thread.Start());
// |thread|'s destructor will join the thread.
@@ -417,9 +497,20 @@ BPF_DEATH_TEST_C(NaClNonSfiSandboxTest,
_exit(1);
}
+void* DoMmap(int prot, int flags) {
+#if defined(OS_NACL_NONSFI)
+ // When PROT_EXEC is set, PNaCl toolchain's mmap() system call wrapper uses
+ // two system calls mmap2(2) and mprotect(2), so that we cannot test
+ // sandbox with the wrapper. Instead, here we use syscall().
+ return reinterpret_cast<void*>(
+ syscall(__NR_mmap2, NULL, getpagesize(), prot, flags, -1, 0));
+#else
+ return mmap(NULL, getpagesize(), prot, flags, -1, 0);
+#endif
+}
+
void* DoAllowedAnonymousMmap() {
- return mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE,
- MAP_ANONYMOUS | MAP_SHARED, -1, 0);
+ return DoMmap(PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED);
}
BPF_TEST_C(NaClNonSfiSandboxTest,
@@ -434,45 +525,42 @@ BPF_DEATH_TEST_C(NaClNonSfiSandboxTest,
mmap_unallowed_flag,
DEATH_SEGV_MESSAGE(sandbox::GetErrorMessageContentForTests()),
nacl::nonsfi::NaClNonSfiBPFSandboxPolicy) {
- mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE,
- MAP_ANONYMOUS | MAP_POPULATE, -1, 0);
+ DoMmap(PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_POPULATE);
}
BPF_DEATH_TEST_C(NaClNonSfiSandboxTest,
mmap_unallowed_prot,
DEATH_SEGV_MESSAGE(sandbox::GetErrorMessageContentForTests()),
nacl::nonsfi::NaClNonSfiBPFSandboxPolicy) {
- mmap(NULL, getpagesize(), PROT_READ | PROT_GROWSDOWN,
- MAP_ANONYMOUS, -1, 0);
+ DoMmap(PROT_READ | PROT_GROWSDOWN, MAP_ANONYMOUS);
}
BPF_DEATH_TEST_C(NaClNonSfiSandboxTest,
mmap_exec,
DEATH_SEGV_MESSAGE(sandbox::GetErrorMessageContentForTests()),
nacl::nonsfi::NaClNonSfiBPFSandboxPolicy) {
- mmap(NULL, getpagesize(), PROT_EXEC, MAP_ANONYMOUS, -1, 0);
+ DoMmap(PROT_EXEC, MAP_ANONYMOUS);
}
BPF_DEATH_TEST_C(NaClNonSfiSandboxTest,
mmap_read_exec,
DEATH_SEGV_MESSAGE(sandbox::GetErrorMessageContentForTests()),
nacl::nonsfi::NaClNonSfiBPFSandboxPolicy) {
- mmap(NULL, getpagesize(), PROT_READ | PROT_EXEC, MAP_ANONYMOUS, -1, 0);
+ DoMmap(PROT_READ | PROT_EXEC, MAP_ANONYMOUS);
}
BPF_DEATH_TEST_C(NaClNonSfiSandboxTest,
mmap_write_exec,
DEATH_SEGV_MESSAGE(sandbox::GetErrorMessageContentForTests()),
nacl::nonsfi::NaClNonSfiBPFSandboxPolicy) {
- mmap(NULL, getpagesize(), PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS, -1, 0);
+ DoMmap(PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS);
}
BPF_DEATH_TEST_C(NaClNonSfiSandboxTest,
mmap_read_write_exec,
DEATH_SEGV_MESSAGE(sandbox::GetErrorMessageContentForTests()),
nacl::nonsfi::NaClNonSfiBPFSandboxPolicy) {
- mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC,
- MAP_ANONYMOUS, -1, 0);
+ DoMmap(PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS);
}
BPF_TEST_C(NaClNonSfiSandboxTest,
@@ -503,9 +591,13 @@ BPF_TEST_C(NaClNonSfiSandboxTest,
// The kernel interface must return zero for brk.
BPF_ASSERT_EQ(0, syscall(__NR_brk, next_brk));
// The libc wrapper translates it to ENOMEM.
+
+ // Note: PNaCl toolchain does not provide brk() system call wrapper.
+#if !defined(OS_NACL_NONSFI)
errno = 0;
BPF_ASSERT_EQ(-1, brk(next_brk));
BPF_ASSERT_EQ(ENOMEM, errno);
+#endif
}
// clockid restrictions are mostly tested in sandbox/ with the
diff --git a/components/nacl_helper_nonsfi_unittests.isolate b/components/nacl_helper_nonsfi_unittests.isolate
new file mode 100644
index 0000000..8de0893
--- /dev/null
+++ b/components/nacl_helper_nonsfi_unittests.isolate
@@ -0,0 +1,18 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+{
+ 'conditions': [
+ ['OS=="linux"', {
+ 'variables': {
+ 'command': [
+ '<(PRODUCT_DIR)/nacl_helper_nonsfi_unittests',
+ ],
+ 'files': [
+ '<(PRODUCT_DIR)/nacl_helper_nonsfi_unittests',
+ ],
+ 'read_only': 1,
+ },
+ }],
+ ],
+}
diff --git a/components/nacl_nonsfi.gyp b/components/nacl_nonsfi.gyp
index 53ff394..2a1aa58 100644
--- a/components/nacl_nonsfi.gyp
+++ b/components/nacl_nonsfi.gyp
@@ -56,8 +56,6 @@
'nacl/loader/nacl_trusted_listener.cc',
'nacl/loader/nonsfi/nonsfi_listener.cc',
'nacl/loader/nonsfi/nonsfi_main.cc',
- 'nacl/loader/nonsfi/nonsfi_sandbox.cc',
- 'nacl/loader/sandbox_linux/nacl_sandbox_linux.cc',
],
'link_flags': [
@@ -74,6 +72,7 @@
'-lgpu_ipc_nacl',
'-lipc_nacl_nonsfi',
'-llatency_info_nacl',
+ '-lnacl_helper_nonsfi_sandbox',
'-lplatform',
'-lppapi_ipc_nacl',
'-lppapi_proxy_nacl',
@@ -99,6 +98,7 @@
'>(tc_lib_dir_nonsfi_helper32)/libgpu_ipc_nacl.a',
'>(tc_lib_dir_nonsfi_helper32)/libipc_nacl_nonsfi.a',
'>(tc_lib_dir_nonsfi_helper32)/liblatency_info_nacl.a',
+ '>(tc_lib_dir_nonsfi_helper32)/libnacl_helper_nonsfi_sandbox.a',
'>(tc_lib_dir_nonsfi_helper32)/libplatform.a',
'>(tc_lib_dir_nonsfi_helper32)/libppapi_ipc_nacl.a',
'>(tc_lib_dir_nonsfi_helper32)/libppapi_proxy_nacl.a',
@@ -123,6 +123,7 @@
'>(tc_lib_dir_nonsfi_helper_arm)/libgpu_ipc_nacl.a',
'>(tc_lib_dir_nonsfi_helper_arm)/libipc_nacl_nonsfi.a',
'>(tc_lib_dir_nonsfi_helper_arm)/liblatency_info_nacl.a',
+ '>(tc_lib_dir_nonsfi_helper_arm)/libnacl_helper_nonsfi_sandbox.a',
'>(tc_lib_dir_nonsfi_helper_arm)/libplatform.a',
'>(tc_lib_dir_nonsfi_helper_arm)/libppapi_ipc_nacl.a',
'>(tc_lib_dir_nonsfi_helper_arm)/libppapi_proxy_nacl.a',
@@ -143,9 +144,132 @@
'../native_client/src/untrusted/nacl/nacl.gyp:nacl_lib_newlib',
'../ppapi/ppapi_proxy_nacl.gyp:ppapi_proxy_nacl',
'../sandbox/sandbox_nacl_nonsfi.gyp:sandbox_nacl_nonsfi',
+ 'nacl_helper_nonsfi_sandbox',
+ ],
+ },
+
+ {
+ 'target_name': 'nacl_helper_nonsfi_sandbox',
+ 'type': 'none',
+ 'variables': {
+ 'nacl_untrusted_build': 1,
+ 'nlib_target': 'libnacl_helper_nonsfi_sandbox.a',
+
+ 'build_glibc': 0,
+ 'build_newlib': 0,
+ 'build_irt': 0,
+ 'build_pnacl_newlib': 0,
+ 'build_nonsfi_helper': 1,
+
+ 'sources': [
+ 'nacl/loader/nonsfi/nonsfi_sandbox.cc',
+ 'nacl/loader/sandbox_linux/nacl_sandbox_linux.cc',
+ ],
+ },
+ 'dependencies': [
+ '../base/base_nacl.gyp:base_nacl_nonsfi',
+ '../content/content_nacl_nonsfi.gyp:content_common_nacl_nonsfi',
+ '../sandbox/sandbox_nacl_nonsfi.gyp:sandbox_nacl_nonsfi',
+ ],
+ },
+
+ {
+ 'target_name': 'nacl_helper_nonsfi_unittests',
+ 'type': 'none',
+ 'variables': {
+ 'nacl_untrusted_build': 1,
+ 'nexe_target': 'nacl_helper_nonsfi_unittests',
+ # Rename the output binary file to nacl_helper_nonsfi_unittests
+ # and put it directly under out/{Debug,Release}/, so that this is
+ # in the standard location, for running on the buildbots.
+ 'out_newlib32_nonsfi': '<(PRODUCT_DIR)/nacl_helper_nonsfi_unittests',
+ 'out_newlib_arm_nonsfi': '<(PRODUCT_DIR)/nacl_helper_nonsfi_unitttests',
+
+ 'build_glibc': 0,
+ 'build_newlib': 0,
+ 'build_irt': 0,
+ 'build_pnacl_newlib': 0,
+ 'build_nonsfi_helper': 1,
+
+ 'sources': [
+ 'nacl/loader/nonsfi/nonsfi_sandbox_sigsys_unittest.cc',
+ 'nacl/loader/nonsfi/nonsfi_sandbox_unittest.cc',
+ ],
+
+ 'link_flags': [
+ '-lbase_nacl_nonsfi',
+ '-lcontent_common_nacl_nonsfi',
+ '-levent_nacl_nonsfi',
+ '-lgio',
+ '-lgtest_main_nacl',
+ '-lgtest_nacl',
+ '-lnacl_helper_nonsfi_sandbox',
+ '-lplatform',
+ '-lsandbox_nacl_nonsfi',
+ '-lsandbox_linux_test_utils_nacl_nonsfi',
+ ],
+
+ 'conditions': [
+ ['target_arch=="ia32" or target_arch=="x64"', {
+ 'extra_deps_newlib32_nonsfi': [
+ '>(tc_lib_dir_nonsfi_helper32)/libbase_nacl_nonsfi.a',
+ '>(tc_lib_dir_nonsfi_helper32)/libcontent_common_nacl_nonsfi.a',
+ '>(tc_lib_dir_nonsfi_helper32)/libevent_nacl_nonsfi.a',
+ '>(tc_lib_dir_nonsfi_helper32)/libgio.a',
+ '>(tc_lib_dir_nonsfi_helper32)/libgtest_main_nacl.a',
+ '>(tc_lib_dir_nonsfi_helper32)/libgtest_nacl.a',
+ '>(tc_lib_dir_nonsfi_helper32)/libnacl_helper_nonsfi_sandbox.a',
+ '>(tc_lib_dir_nonsfi_helper32)/libplatform.a',
+ '>(tc_lib_dir_nonsfi_helper32)/libsandbox_nacl_nonsfi.a',
+ '>(tc_lib_dir_nonsfi_helper32)/libsandbox_linux_test_utils_nacl_nonsfi.a',
+ ],
+ }],
+ ['target_arch=="arm"', {
+ 'extra_deps_newlib_arm_nonsfi': [
+ '>(tc_lib_dir_nonsfi_helper_arm)/libbase_nacl_nonsfi.a',
+ '>(tc_lib_dir_nonsfi_helper_arm)/libcontent_common_nacl_nonsfi.a',
+ '>(tc_lib_dir_nonsfi_helper_arm)/libevent_nacl_nonsfi.a',
+ '>(tc_lib_dir_nonsfi_helper_arm)/libgio.a',
+ '>(tc_lib_dir_nonsfi_helper_arm)/libgtest_main_nacl.a',
+ '>(tc_lib_dir_nonsfi_helper_arm)/libgtest_nacl.a',
+ '>(tc_lib_dir_nonsfi_helper_arm)/libnacl_helper_nonsfi_sandbox.a',
+ '>(tc_lib_dir_nonsfi_helper_arm)/libplatform.a',
+ '>(tc_lib_dir_nonsfi_helper_arm)/libsandbox_nacl_nonsfi.a',
+ '>(tc_lib_dir_nonsfi_helper_arm)/libsandbox_linux_test_utils_nacl_nonsfi.a',
+ ],
+ }],
+ ],
+ },
+
+ 'dependencies': [
+ '../base/base_nacl.gyp:base_nacl_nonsfi',
+ '../content/content_nacl_nonsfi.gyp:content_common_nacl_nonsfi',
+ '../native_client/src/nonsfi/irt/irt.gyp:nacl_sys_private',
+ '../native_client/src/untrusted/nacl/nacl.gyp:nacl_lib_newlib',
+ '../sandbox/sandbox_nacl_nonsfi.gyp:sandbox_nacl_nonsfi',
+ '../sandbox/sandbox_nacl_nonsfi.gyp:sandbox_linux_test_utils_nacl_nonsfi',
+ '../testing/gtest_nacl.gyp:gtest_main_nacl',
+ '../testing/gtest_nacl.gyp:gtest_nacl',
+ 'nacl_helper_nonsfi_sandbox',
+ ],
+ },
+ ],
+ }],
+ ['disable_nacl==0 and disable_nacl_untrusted==0 and test_isolation_mode!="noop"', {
+ 'targets': [
+ {
+ 'target_name': 'nacl_helper_nonsfi_unittests_run',
+ 'type': 'none',
+ 'dependencies': [
+ 'nacl_helper_nonsfi_unittests',
+ ],
+ 'includes': [
+ '../build/isolate.gypi',
+ ],
+ 'sources': [
+ 'nacl_helper_nonsfi_unittests.isolate',
],
},
- # TODO(hidehiko): Add Non-SFI version of nacl_loader_unittests.
],
}],
],