Home | History | Annotate | Download | only in seccomp-bpf
      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 "base/macros.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "sandbox/linux/seccomp-bpf/sandbox_bpf_test_runner.h"
     11 
     12 namespace sandbox {
     13 
     14 // This templated class allows building a BPFTesterDelegate from a
     15 // deprecated-style BPF policy (that is a SyscallEvaluator function pointer,
     16 // instead of a SandboxBPFPolicy class), specified in |policy_function| and a
     17 // function pointer to a test in |test_function|.
     18 // This allows both the policy and the test function to take a pointer to an
     19 // object of type "Aux" as a parameter. This is used to implement the BPF_TEST
     20 // macro and should generally not be used directly.
     21 template <class Policy, class Aux>
     22 class BPFTesterCompatibilityDelegate : public BPFTesterDelegate {
     23  public:
     24   typedef void (*TestFunction)(Aux*);
     25 
     26   explicit BPFTesterCompatibilityDelegate(TestFunction test_function)
     27       : aux_(), test_function_(test_function) {}
     28 
     29   ~BPFTesterCompatibilityDelegate() override {}
     30 
     31   scoped_ptr<bpf_dsl::Policy> GetSandboxBPFPolicy() override {
     32     // The current method is guaranteed to only run in the child process
     33     // running the test. In this process, the current object is guaranteed
     34     // to live forever. So it's ok to pass aux_pointer_for_policy_ to
     35     // the policy, which could in turn pass it to the kernel via Trap().
     36     return scoped_ptr<bpf_dsl::Policy>(new Policy(&aux_));
     37   }
     38 
     39   void RunTestFunction() override {
     40     // Run the actual test.
     41     // The current object is guaranteed to live forever in the child process
     42     // where this will run.
     43     test_function_(&aux_);
     44   }
     45 
     46  private:
     47   Aux aux_;
     48   TestFunction test_function_;
     49 
     50   DISALLOW_COPY_AND_ASSIGN(BPFTesterCompatibilityDelegate);
     51 };
     52 
     53 }  // namespace sandbox
     54 
     55 #endif  // SANDBOX_LINUX_SECCOMP_BPF_BPF_TESTER_COMPATIBILITY_DELEGATE_H_
     56