OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef SANDBOX_LINUX_SECCOMP_BPF_BPF_TESTER_COMPATIBILITY_DELEGATE_H_ | 5 #ifndef SANDBOX_LINUX_SECCOMP_BPF_BPF_TESTER_COMPATIBILITY_DELEGATE_H_ |
6 #define SANDBOX_LINUX_SECCOMP_BPF_BPF_TESTER_COMPATIBILITY_DELEGATE_H_ | 6 #define SANDBOX_LINUX_SECCOMP_BPF_BPF_TESTER_COMPATIBILITY_DELEGATE_H_ |
7 | 7 |
8 #include <fcntl.h> | 8 #include <fcntl.h> |
9 #include <sys/stat.h> | 9 #include <sys/stat.h> |
10 #include <sys/types.h> | 10 #include <sys/types.h> |
11 | 11 |
12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
13 #include "sandbox/linux/seccomp-bpf/sandbox_bpf_compatibility_policy.h" | 13 #include "sandbox/linux/seccomp-bpf/sandbox_bpf_compatibility_policy.h" |
14 #include "sandbox/linux/seccomp-bpf/sandbox_bpf_test_runner.h" | 14 #include "sandbox/linux/seccomp-bpf/sandbox_bpf_test_runner.h" |
15 #include "sandbox/linux/tests/sandbox_test_runner.h" | 15 #include "sandbox/linux/tests/sandbox_test_runner.h" |
16 #include "sandbox/linux/tests/unit_tests.h" | 16 #include "sandbox/linux/tests/unit_tests.h" |
17 | 17 |
18 namespace sandbox { | 18 namespace sandbox { |
19 | 19 |
| 20 namespace internal { |
| 21 |
| 22 // Internal helper class to hold a value of type T. |
| 23 template <typename T> |
| 24 class AuxHolder { |
| 25 public: |
| 26 AuxHolder() : val_() {} |
| 27 T* get() { return &val_; } |
| 28 |
| 29 private: |
| 30 T val_; |
| 31 }; |
| 32 |
| 33 // Specialization of AuxHolder for void. |
| 34 // Returns a null pointer instead of allocating void. |
| 35 template <> |
| 36 class AuxHolder<void> { |
| 37 public: |
| 38 AuxHolder() {} |
| 39 void* get() { return NULL; } |
| 40 }; |
| 41 |
| 42 } // namespace internal |
| 43 |
20 // This templated class allows building a BPFTesterDelegate from a | 44 // This templated class allows building a BPFTesterDelegate from a |
21 // deprecated-style BPF policy (that is a SyscallEvaluator function pointer, | 45 // deprecated-style BPF policy (that is a SyscallEvaluator function pointer, |
22 // instead of a SandboxBPFPolicy class), specified in |policy_function| and a | 46 // instead of a SandboxBPFPolicy class), specified in |policy_function| and a |
23 // function pointer to a test in |test_function|. | 47 // function pointer to a test in |test_function|. |
24 // This allows both the policy and the test function to take a pointer to an | 48 // 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 | 49 // object of type "Aux" as a parameter. This is used to implement the BPF_TEST |
26 // macro and should generally not be used directly. | 50 // macro and should generally not be used directly. |
27 template <class Aux = void> | 51 template <class Aux = void> |
28 class BPFTesterCompatibilityDelegate : public BPFTesterDelegate { | 52 class BPFTesterCompatibilityDelegate : public BPFTesterDelegate { |
29 public: | 53 public: |
30 typedef Aux AuxType; | 54 typedef Aux AuxType; |
31 BPFTesterCompatibilityDelegate( | 55 BPFTesterCompatibilityDelegate( |
32 void (*test_function)(AuxType*), | 56 void (*test_function)(AuxType*), |
33 typename CompatibilityPolicy<AuxType>::SyscallEvaluator policy_function) | 57 typename CompatibilityPolicy<AuxType>::SyscallEvaluator policy_function) |
34 : aux_pointer_for_policy_(NULL), | 58 : aux_holder_(), |
35 test_function_(test_function), | 59 test_function_(test_function), |
36 policy_function_(policy_function) { | 60 policy_function_(policy_function) {} |
37 // This will be NULL iff AuxType is void. | |
38 aux_pointer_for_policy_ = NewAux(); | |
39 } | |
40 | 61 |
41 virtual ~BPFTesterCompatibilityDelegate() { | 62 virtual ~BPFTesterCompatibilityDelegate() {} |
42 DeleteAux(aux_pointer_for_policy_); | |
43 } | |
44 | 63 |
45 virtual scoped_ptr<SandboxBPFPolicy> GetSandboxBPFPolicy() OVERRIDE { | 64 virtual scoped_ptr<SandboxBPFPolicy> GetSandboxBPFPolicy() OVERRIDE { |
46 // The current method is guaranteed to only run in the child process | 65 // The current method is guaranteed to only run in the child process |
47 // running the test. In this process, the current object is guaranteed | 66 // running the test. In this process, the current object is guaranteed |
48 // to live forever. So it's ok to pass aux_pointer_for_policy_ to | 67 // to live forever. So it's ok to pass aux_pointer_for_policy_ to |
49 // the policy, which could in turn pass it to the kernel via Trap(). | 68 // the policy, which could in turn pass it to the kernel via Trap(). |
50 return scoped_ptr<SandboxBPFPolicy>(new CompatibilityPolicy<AuxType>( | 69 return scoped_ptr<SandboxBPFPolicy>( |
51 policy_function_, aux_pointer_for_policy_)); | 70 new CompatibilityPolicy<AuxType>(policy_function_, aux_holder_.get())); |
52 } | 71 } |
53 | 72 |
54 virtual void RunTestFunction() OVERRIDE { | 73 virtual void RunTestFunction() OVERRIDE { |
55 // Run the actual test. | 74 // Run the actual test. |
56 // The current object is guaranteed to live forever in the child process | 75 // The current object is guaranteed to live forever in the child process |
57 // where this will run. | 76 // where this will run. |
58 test_function_(aux_pointer_for_policy_); | 77 test_function_(aux_holder_.get()); |
59 } | 78 } |
60 | 79 |
61 private: | 80 private: |
62 // Allocate an object of type Aux. This is specialized to return NULL when | 81 internal::AuxHolder<AuxType> aux_holder_; |
63 // trying to allocate a void. | |
64 static Aux* NewAux() { return new Aux(); } | |
65 static void DeleteAux(Aux* aux) { delete aux; } | |
66 | |
67 AuxType* aux_pointer_for_policy_; | |
68 void (*test_function_)(AuxType*); | 82 void (*test_function_)(AuxType*); |
69 typename CompatibilityPolicy<AuxType>::SyscallEvaluator policy_function_; | 83 typename CompatibilityPolicy<AuxType>::SyscallEvaluator policy_function_; |
70 DISALLOW_COPY_AND_ASSIGN(BPFTesterCompatibilityDelegate); | 84 DISALLOW_COPY_AND_ASSIGN(BPFTesterCompatibilityDelegate); |
71 }; | 85 }; |
72 | 86 |
73 // Specialization of NewAux that returns NULL; | |
74 template <> | |
75 void* BPFTesterCompatibilityDelegate<void>::NewAux(); | |
76 template <> | |
77 void BPFTesterCompatibilityDelegate<void>::DeleteAux(void* aux); | |
78 | |
79 } // namespace sandbox | 87 } // namespace sandbox |
80 | 88 |
81 #endif // SANDBOX_LINUX_SECCOMP_BPF_BPF_TESTER_COMPATIBILITY_DELEGATE_H_ | 89 #endif // SANDBOX_LINUX_SECCOMP_BPF_BPF_TESTER_COMPATIBILITY_DELEGATE_H_ |
OLD | NEW |