Index: components/nacl/loader/nonsfi/nonsfi_sandbox_unittest.cc |
diff --git a/components/nacl/loader/nonsfi/nonsfi_sandbox_unittest.cc b/components/nacl/loader/nonsfi/nonsfi_sandbox_unittest.cc |
index febbcd927057d65610c5624915b6fb740e79af44..8d0a4d499a5ad0d1e638a1e4fe5c23617a660b7e 100644 |
--- a/components/nacl/loader/nonsfi/nonsfi_sandbox_unittest.cc |
+++ b/components/nacl/loader/nonsfi/nonsfi_sandbox_unittest.cc |
@@ -22,6 +22,7 @@ |
#include <sys/syscall.h> |
#include <sys/types.h> |
#include <sys/wait.h> |
+#include <time.h> |
#include <unistd.h> |
#include "base/bind.h" |
@@ -32,6 +33,7 @@ |
#include "base/posix/eintr_wrapper.h" |
#include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h" |
#include "sandbox/linux/seccomp-bpf/bpf_tests.h" |
+#include "third_party/lss/linux_syscall_support.h" // for MAKE_PROCESS_CPUCLOCK |
namespace { |
@@ -391,6 +393,45 @@ BPF_TEST_C(NaClNonSfiSandboxTest, |
BPF_ASSERT_EQ(ENOMEM, errno); |
} |
+void CheckClock(clockid_t clockid) { |
+ struct timespec ts; |
+ ts.tv_sec = ts.tv_nsec = -1; |
+ BPF_ASSERT_EQ(0, clock_gettime(clockid, &ts)); |
+ BPF_ASSERT_LE(0, ts.tv_sec); |
+ BPF_ASSERT_LE(0, ts.tv_nsec); |
+} |
+ |
+BPF_TEST_C(NaClNonSfiSandboxTest, |
+ clock_gettime_allowed, |
+ nacl::nonsfi::NaClNonSfiBPFSandboxPolicy) { |
+ CheckClock(CLOCK_MONOTONIC); |
+ CheckClock(CLOCK_PROCESS_CPUTIME_ID); |
+ CheckClock(CLOCK_REALTIME); |
+ CheckClock(CLOCK_THREAD_CPUTIME_ID); |
+} |
+ |
+BPF_DEATH_TEST_C(NaClNonSfiSandboxTest, |
+ clock_gettime_crash_monotonic_raw, |
+ DEATH_MESSAGE(sandbox::GetErrorMessageContentForTests()), |
+ nacl::nonsfi::NaClNonSfiBPFSandboxPolicy) { |
+ struct timespec ts; |
+ clock_gettime(CLOCK_MONOTONIC_RAW, &ts); |
+} |
+ |
+BPF_DEATH_TEST_C(NaClNonSfiSandboxTest, |
+ clock_gettime_crash_cpu_clock, |
+ DEATH_MESSAGE(sandbox::GetErrorMessageContentForTests()), |
+ nacl::nonsfi::NaClNonSfiBPFSandboxPolicy) { |
+ // We can't use clock_getcpuclockid() because it's not implemented in newlib, |
+ // and it might not work inside the sandbox anyway. |
+ const pid_t kInitPID = 1; |
+ const clockid_t kInitCPUClockID = |
+ MAKE_PROCESS_CPUCLOCK(kInitPID, CPUCLOCK_SCHED); |
+ |
+ struct timespec ts; |
+ clock_gettime(kInitCPUClockID, &ts); |
+} |
+ |
// The following test cases check if syscalls return EPERM regardless |
// of arguments. |
#define RESTRICT_SYSCALL_EPERM_TEST(name) \ |