| Index: sandbox/linux/seccomp-bpf/bpf_tester_compatibility_delegate.h
|
| diff --git a/sandbox/linux/seccomp-bpf/bpf_tester_compatibility_delegate.h b/sandbox/linux/seccomp-bpf/bpf_tester_compatibility_delegate.h
|
| index c211d04343358957da05f14d1daad3a54d9fd111..5c2f3416b901447ce2d523ae7e69df843c2c9727 100644
|
| --- a/sandbox/linux/seccomp-bpf/bpf_tester_compatibility_delegate.h
|
| +++ b/sandbox/linux/seccomp-bpf/bpf_tester_compatibility_delegate.h
|
| @@ -17,6 +17,30 @@
|
|
|
| namespace sandbox {
|
|
|
| +namespace internal {
|
| +
|
| +// Internal helper class to hold a value of type T.
|
| +template <typename T>
|
| +class AuxHolder {
|
| + public:
|
| + AuxHolder() : val_() {}
|
| + T* get() { return &val_; }
|
| +
|
| + private:
|
| + T val_;
|
| +};
|
| +
|
| +// Specialization of AuxHolder for void.
|
| +// Returns a null pointer instead of allocating void.
|
| +template <>
|
| +class AuxHolder<void> {
|
| + public:
|
| + AuxHolder() {}
|
| + void* get() { return NULL; }
|
| +};
|
| +
|
| +} // namespace internal
|
| +
|
| // This templated class allows building a BPFTesterDelegate from a
|
| // deprecated-style BPF policy (that is a SyscallEvaluator function pointer,
|
| // instead of a SandboxBPFPolicy class), specified in |policy_function| and a
|
| @@ -31,51 +55,35 @@ class BPFTesterCompatibilityDelegate : public BPFTesterDelegate {
|
| BPFTesterCompatibilityDelegate(
|
| void (*test_function)(AuxType*),
|
| typename CompatibilityPolicy<AuxType>::SyscallEvaluator policy_function)
|
| - : aux_pointer_for_policy_(NULL),
|
| + : aux_holder_(),
|
| test_function_(test_function),
|
| - policy_function_(policy_function) {
|
| - // This will be NULL iff AuxType is void.
|
| - aux_pointer_for_policy_ = NewAux();
|
| - }
|
| + policy_function_(policy_function) {}
|
|
|
| - virtual ~BPFTesterCompatibilityDelegate() {
|
| - DeleteAux(aux_pointer_for_policy_);
|
| - }
|
| + virtual ~BPFTesterCompatibilityDelegate() {}
|
|
|
| virtual scoped_ptr<SandboxBPFPolicy> GetSandboxBPFPolicy() OVERRIDE {
|
| // The current method is guaranteed to only run in the child process
|
| // running the test. In this process, the current object is guaranteed
|
| // to live forever. So it's ok to pass aux_pointer_for_policy_ to
|
| // the policy, which could in turn pass it to the kernel via Trap().
|
| - return scoped_ptr<SandboxBPFPolicy>(new CompatibilityPolicy<AuxType>(
|
| - policy_function_, aux_pointer_for_policy_));
|
| + return scoped_ptr<SandboxBPFPolicy>(
|
| + new CompatibilityPolicy<AuxType>(policy_function_, aux_holder_.get()));
|
| }
|
|
|
| virtual void RunTestFunction() OVERRIDE {
|
| // Run the actual test.
|
| // The current object is guaranteed to live forever in the child process
|
| // where this will run.
|
| - test_function_(aux_pointer_for_policy_);
|
| + test_function_(aux_holder_.get());
|
| }
|
|
|
| private:
|
| - // Allocate an object of type Aux. This is specialized to return NULL when
|
| - // trying to allocate a void.
|
| - static Aux* NewAux() { return new Aux(); }
|
| - static void DeleteAux(Aux* aux) { delete aux; }
|
| -
|
| - AuxType* aux_pointer_for_policy_;
|
| + internal::AuxHolder<AuxType> aux_holder_;
|
| void (*test_function_)(AuxType*);
|
| typename CompatibilityPolicy<AuxType>::SyscallEvaluator policy_function_;
|
| DISALLOW_COPY_AND_ASSIGN(BPFTesterCompatibilityDelegate);
|
| };
|
|
|
| -// Specialization of NewAux that returns NULL;
|
| -template <>
|
| -void* BPFTesterCompatibilityDelegate<void>::NewAux();
|
| -template <>
|
| -void BPFTesterCompatibilityDelegate<void>::DeleteAux(void* aux);
|
| -
|
| } // namespace sandbox
|
|
|
| #endif // SANDBOX_LINUX_SECCOMP_BPF_BPF_TESTER_COMPATIBILITY_DELEGATE_H_
|
|
|