| Index: sandbox/linux/seccomp-bpf/bpf_tests_unittest.cc
|
| diff --git a/sandbox/linux/seccomp-bpf/bpf_tests_unittest.cc b/sandbox/linux/seccomp-bpf/bpf_tests_unittest.cc
|
| index 41c3dd3816bbe1ba2240c4d7153ebbba087c8270..6803e2affb4ce22e4be6ede436d8f5d299b8454d 100644
|
| --- a/sandbox/linux/seccomp-bpf/bpf_tests_unittest.cc
|
| +++ b/sandbox/linux/seccomp-bpf/bpf_tests_unittest.cc
|
| @@ -5,6 +5,7 @@
|
| #include "sandbox/linux/seccomp-bpf/bpf_tests.h"
|
|
|
| #include <errno.h>
|
| +#include <sys/ptrace.h>
|
|
|
| #include "base/logging.h"
|
| #include "base/memory/scoped_ptr.h"
|
| @@ -71,21 +72,71 @@ BPF_TEST(BPFTest,
|
| void DummyTestFunction(FourtyTwo *fourty_two) {
|
| }
|
|
|
| -TEST(BPFTest, BPFTesterSimpleDelegateLeakTest) {
|
| +TEST(BPFTest, BPFTesterCompatibilityDelegateLeakTest) {
|
| // Don't do anything, simply gives dynamic tools an opportunity to detect
|
| // leaks.
|
| {
|
| - BPFTesterSimpleDelegate<FourtyTwo> simple_delegate(DummyTestFunction,
|
| - EmptyPolicyTakesClass);
|
| + BPFTesterCompatibilityDelegate<FourtyTwo> simple_delegate(
|
| + DummyTestFunction, EmptyPolicyTakesClass);
|
| }
|
| {
|
| // Test polymorphism.
|
| scoped_ptr<BPFTesterDelegate> simple_delegate(
|
| - new BPFTesterSimpleDelegate<FourtyTwo>(DummyTestFunction,
|
| - EmptyPolicyTakesClass));
|
| + new BPFTesterCompatibilityDelegate<FourtyTwo>(DummyTestFunction,
|
| + EmptyPolicyTakesClass));
|
| }
|
| }
|
|
|
| +class EnosysPtracePolicy : public SandboxBPFPolicy {
|
| + public:
|
| + EnosysPtracePolicy() {}
|
| + virtual ~EnosysPtracePolicy() {}
|
| +
|
| + virtual ErrorCode EvaluateSyscall(SandboxBPF* sandbox_compiler,
|
| + int system_call_number) const OVERRIDE {
|
| + if (!SandboxBPF::IsValidSyscallNumber(system_call_number) ||
|
| + system_call_number == __NR_ptrace) {
|
| + return ErrorCode(ENOSYS);
|
| + } else {
|
| + return ErrorCode(ErrorCode::ERR_ALLOWED);
|
| + }
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(EnosysPtracePolicy);
|
| +};
|
| +
|
| +class BasicBPFTesterDelegate : public BPFTesterDelegate {
|
| + public:
|
| + BasicBPFTesterDelegate() {}
|
| + virtual ~BasicBPFTesterDelegate() {}
|
| +
|
| + virtual scoped_ptr<SandboxBPFPolicy> GetSandboxBPFPolicy() OVERRIDE {
|
| + return scoped_ptr<SandboxBPFPolicy>(new EnosysPtracePolicy());
|
| + }
|
| + virtual void RunTestFunction() OVERRIDE {
|
| + errno = 0;
|
| + int ret = ptrace(PTRACE_TRACEME, -1, NULL, NULL);
|
| + BPF_ASSERT(-1 == ret);
|
| + BPF_ASSERT(ENOSYS == errno);
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(BasicBPFTesterDelegate);
|
| +};
|
| +
|
| +// This is the most powerful and complex way to create a BPF test, but it
|
| +// requires a full class definition (BasicBPFTesterDelegate).
|
| +BPF_TEST_D(BPFTest, BPFTestWithDelegateClass, BasicBPFTesterDelegate);
|
| +
|
| +// This is the simplest form of BPF tests.
|
| +BPF_TEST_C(BPFTest, BPFTestWithInlineTest, EnosysPtracePolicy) {
|
| + errno = 0;
|
| + int ret = ptrace(PTRACE_TRACEME, -1, NULL, NULL);
|
| + BPF_ASSERT(-1 == ret);
|
| + BPF_ASSERT(ENOSYS == errno);
|
| +}
|
| +
|
| } // namespace
|
|
|
| } // namespace sandbox
|
|
|