1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef SANDBOX_LINUX_SECCOMP_BPF_BPF_TESTER_COMPATIBILITY_DELEGATE_H_ 6 #define SANDBOX_LINUX_SECCOMP_BPF_BPF_TESTER_COMPATIBILITY_DELEGATE_H_ 7 8 #include <fcntl.h> 9 #include <sys/stat.h> 10 #include <sys/types.h> 11 12 #include "base/memory/scoped_ptr.h" 13 #include "sandbox/linux/seccomp-bpf/sandbox_bpf_compatibility_policy.h" 14 #include "sandbox/linux/seccomp-bpf/sandbox_bpf_test_runner.h" 15 #include "sandbox/linux/tests/sandbox_test_runner.h" 16 #include "sandbox/linux/tests/unit_tests.h" 17 18 namespace sandbox { 19 20 // This templated class allows building a BPFTesterDelegate from a 21 // deprecated-style BPF policy (that is a SyscallEvaluator function pointer, 22 // instead of a SandboxBPFPolicy class), specified in |policy_function| and a 23 // function pointer to a test in |test_function|. 24 // This allows both the policy and the test function to take a pointer to an 25 // object of type "Aux" as a parameter. This is used to implement the BPF_TEST 26 // macro and should generally not be used directly. 27 template <class Aux> 28 class BPFTesterCompatibilityDelegate : public BPFTesterDelegate { 29 public: 30 typedef Aux AuxType; BPFTesterCompatibilityDelegate(void (* test_function)(AuxType *),typename CompatibilityPolicy<AuxType>::SyscallEvaluator policy_function)31 BPFTesterCompatibilityDelegate( 32 void (*test_function)(AuxType*), 33 typename CompatibilityPolicy<AuxType>::SyscallEvaluator policy_function) 34 : aux_(), 35 test_function_(test_function), 36 policy_function_(policy_function) {} 37 ~BPFTesterCompatibilityDelegate()38 virtual ~BPFTesterCompatibilityDelegate() {} 39 GetSandboxBPFPolicy()40 virtual scoped_ptr<SandboxBPFPolicy> GetSandboxBPFPolicy() OVERRIDE { 41 // The current method is guaranteed to only run in the child process 42 // running the test. In this process, the current object is guaranteed 43 // to live forever. So it's ok to pass aux_pointer_for_policy_ to 44 // the policy, which could in turn pass it to the kernel via Trap(). 45 return scoped_ptr<SandboxBPFPolicy>( 46 new CompatibilityPolicy<AuxType>(policy_function_, &aux_)); 47 } 48 RunTestFunction()49 virtual void RunTestFunction() OVERRIDE { 50 // Run the actual test. 51 // The current object is guaranteed to live forever in the child process 52 // where this will run. 53 test_function_(&aux_); 54 } 55 56 private: 57 AuxType aux_; 58 void (*test_function_)(AuxType*); 59 typename CompatibilityPolicy<AuxType>::SyscallEvaluator policy_function_; 60 DISALLOW_COPY_AND_ASSIGN(BPFTesterCompatibilityDelegate); 61 }; 62 63 } // namespace sandbox 64 65 #endif // SANDBOX_LINUX_SECCOMP_BPF_BPF_TESTER_COMPATIBILITY_DELEGATE_H_ 66