Index: sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions_unittests.cc |
diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions_unittests.cc b/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions_unittests.cc |
index 7ea1cc2ff9ae286bcb97d5da8268353a45ce3b87..3a6b7dc5095fc95158a2712d545caf6bfc6e5897 100644 |
--- a/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions_unittests.cc |
+++ b/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions_unittests.cc |
@@ -4,9 +4,12 @@ |
#include "sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h" |
+#include <sched.h> |
#include <time.h> |
+#include "base/bind.h" |
#include "base/sys_info.h" |
+#include "base/threading/thread.h" |
#include "base/time/time.h" |
#include "build/build_config.h" |
#include "sandbox/linux/bpf_dsl/bpf_dsl.h" |
@@ -136,6 +139,63 @@ BPF_DEATH_TEST_C(ParameterRestrictions, |
} |
#endif // !defined(OS_ANDROID) |
+class RestrictSchedPolicy : public SandboxBPFDSLPolicy { |
+ public: |
+ RestrictSchedPolicy() {} |
+ virtual ~RestrictSchedPolicy() {} |
+ |
+ virtual ResultExpr EvaluateSyscall(int sysno) const OVERRIDE { |
+ switch (sysno) { |
+ case __NR_sched_getaffinity: |
+ return RestrictSchedTarget(getpid(), sysno); |
+ default: |
+ return Allow(); |
+ } |
+ } |
+}; |
+ |
+void CheckSchedGetAffinity(pid_t pid, cpu_set_t* mask) { |
+ BPF_ASSERT_EQ(0, sched_getaffinity(pid, sizeof(*mask), mask)); |
+} |
+ |
+void SchedGetAffinityThread() { |
+ const pid_t pid = getpid(); |
+ const pid_t tid = syscall(__NR_gettid); |
+ BPF_ASSERT_NE(pid, tid); |
+ |
+ cpu_set_t current_pid_mask; |
+ CheckSchedGetAffinity(pid, ¤t_pid_mask); |
+ |
+ cpu_set_t zero_mask; |
+ CheckSchedGetAffinity(0, &zero_mask); |
+ |
+ cpu_set_t tid_mask; |
+ CheckSchedGetAffinity(tid, &tid_mask); |
+ |
+ BPF_ASSERT(CPU_EQUAL(&zero_mask, &tid_mask)); |
jln (very slow on Chromium)
2014/09/22 21:56:44
Could you add some testing of errno if you make so
rickyz (no longer on Chrome)
2014/09/23 06:03:20
Done.
|
+} |
+ |
+BPF_TEST_C(ParameterRestrictions, |
+ sched_getaffinity_allowed, |
+ RestrictClockIdPolicy) { |
+ // Run the actual test in a new thread so that the current pid and tid are |
+ // different. |
+ base::Thread getaffinity_thread("getaffinity_thread"); |
+ BPF_ASSERT(getaffinity_thread.Start()); |
+ getaffinity_thread.message_loop()->PostTask( |
+ FROM_HERE, base::Bind(&SchedGetAffinityThread)); |
+ getaffinity_thread.Stop(); |
jln (very slow on Chromium)
2014/09/22 21:56:44
You need synchronization here to make sure that yo
rickyz (no longer on Chrome)
2014/09/23 06:03:20
Done.
|
+} |
+ |
+BPF_DEATH_TEST_C(ParameterRestrictions, |
+ sched_getaffinity_crash_non_zero, |
+ DEATH_SEGV_MESSAGE(sandbox::GetErrorMessageContentForTests()), |
+ RestrictSchedPolicy) { |
+ const pid_t kInitPID = 1; |
+ cpu_set_t mask; |
+ sched_getaffinity(kInitPID, sizeof(mask), &mask); |
+} |
+ |
} // namespace |
} // namespace sandbox |