| Index: sandbox/linux/bpf_dsl/bpf_dsl.h
|
| diff --git a/sandbox/linux/bpf_dsl/bpf_dsl.h b/sandbox/linux/bpf_dsl/bpf_dsl.h
|
| deleted file mode 100644
|
| index d46102aff0c14f56fa6336293a8474381145f04e..0000000000000000000000000000000000000000
|
| --- a/sandbox/linux/bpf_dsl/bpf_dsl.h
|
| +++ /dev/null
|
| @@ -1,246 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#ifndef SANDBOX_LINUX_BPF_DSL_BPF_DSL_H_
|
| -#define SANDBOX_LINUX_BPF_DSL_BPF_DSL_H_
|
| -
|
| -#include <stdint.h>
|
| -
|
| -#include <utility>
|
| -
|
| -#include "base/macros.h"
|
| -#include "base/memory/ref_counted.h"
|
| -#include "sandbox/linux/bpf_dsl/cons.h"
|
| -#include "sandbox/linux/seccomp-bpf/sandbox_bpf_policy.h"
|
| -#include "sandbox/linux/seccomp-bpf/trap.h"
|
| -#include "sandbox/sandbox_export.h"
|
| -
|
| -namespace sandbox {
|
| -class ErrorCode;
|
| -class SandboxBPF;
|
| -}
|
| -
|
| -// The sandbox::bpf_dsl namespace provides a domain-specific language
|
| -// to make writing BPF policies more expressive. In general, the
|
| -// object types all have value semantics (i.e., they can be copied
|
| -// around, returned from or passed to function calls, etc. without any
|
| -// surprising side effects), though not all support assignment.
|
| -//
|
| -// An idiomatic and demonstrative (albeit silly) example of this API
|
| -// would be:
|
| -//
|
| -// #include "sandbox/linux/bpf_dsl/bpf_dsl.h"
|
| -//
|
| -// using namespace sandbox::bpf_dsl;
|
| -//
|
| -// class SillyPolicy : public SandboxBPFDSLPolicy {
|
| -// public:
|
| -// SillyPolicy() {}
|
| -// virtual ~SillyPolicy() {}
|
| -// virtual ResultExpr EvaluateSyscall(int sysno) const OVERRIDE {
|
| -// if (sysno == __NR_fcntl) {
|
| -// Arg<int> fd(0), cmd(1);
|
| -// Arg<unsigned long> flags(2);
|
| -// const unsigned long kBadFlags = ~(O_ACCMODE | O_NONBLOCK);
|
| -// return If(fd == 0 && cmd == F_SETFL && (flags & kBadFlags) == 0,
|
| -// Allow())
|
| -// .ElseIf(cmd == F_DUPFD || cmd == F_DUPFD_CLOEXEC,
|
| -// Error(EMFILE))
|
| -// .Else(Trap(SetFlagHandler, NULL));
|
| -// } else {
|
| -// return Allow();
|
| -// }
|
| -// }
|
| -//
|
| -// private:
|
| -// DISALLOW_COPY_AND_ASSIGN(SillyPolicy);
|
| -// };
|
| -//
|
| -// More generally, the DSL currently supports the following grammar:
|
| -//
|
| -// result = Allow() | Error(errno) | Trap(trap_func, arg)
|
| -// | If(bool, result)[.ElseIf(bool, result)].Else(result)
|
| -// bool = arg == val | (arg & mask) == mask | (arg & mask) == 0
|
| -// | !bool | bool && bool | bool || bool
|
| -//
|
| -// The semantics of each function and operator are intended to be
|
| -// intuitive, but are described in more detail below.
|
| -//
|
| -// (Credit to Sean Parent's "Inheritance is the Base Class of Evil"
|
| -// talk at Going Native 2013 for promoting value semantics via shared
|
| -// pointers to immutable state.)
|
| -
|
| -namespace sandbox {
|
| -namespace bpf_dsl {
|
| -
|
| -// Forward declarations of classes; see below for proper documentation.
|
| -class Elser;
|
| -namespace internal {
|
| -class ResultExprImpl;
|
| -class BoolExprImpl;
|
| -}
|
| -
|
| -// ResultExpr is an opaque reference to an immutable result expression tree.
|
| -typedef scoped_refptr<const internal::ResultExprImpl> ResultExpr;
|
| -
|
| -// BoolExpr is an opaque reference to an immutable boolean expression tree.
|
| -typedef scoped_refptr<const internal::BoolExprImpl> BoolExpr;
|
| -
|
| -// Helper class to make writing policies easier.
|
| -class SANDBOX_EXPORT SandboxBPFDSLPolicy : public SandboxBPFPolicy {
|
| - public:
|
| - SandboxBPFDSLPolicy() : SandboxBPFPolicy() {}
|
| - virtual ~SandboxBPFDSLPolicy() {}
|
| -
|
| - // User extension point for writing custom sandbox policies.
|
| - virtual ResultExpr EvaluateSyscall(int sysno) const = 0;
|
| -
|
| - // Optional overload for specifying alternate behavior for invalid
|
| - // system calls. The default is to return ENOSYS.
|
| - virtual ResultExpr InvalidSyscall() const;
|
| -
|
| - // Override implementations from SandboxBPFPolicy. Marked as FINAL
|
| - // to prevent mixups with child classes accidentally overloading
|
| - // these instead of the above methods.
|
| - virtual ErrorCode EvaluateSyscall(SandboxBPF* sb,
|
| - int sysno) const OVERRIDE FINAL;
|
| - virtual ErrorCode InvalidSyscall(SandboxBPF* sb) const OVERRIDE FINAL;
|
| -
|
| - // Helper method so policies can just write Trap(func, aux).
|
| - static ResultExpr Trap(::sandbox::Trap::TrapFnc trap_func, void* aux);
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(SandboxBPFDSLPolicy);
|
| -};
|
| -
|
| -// Allow specifies a result that the system call should be allowed to
|
| -// execute normally.
|
| -SANDBOX_EXPORT ResultExpr Allow();
|
| -
|
| -// Error specifies a result that the system call should fail with
|
| -// error number |err|. As a special case, Error(0) will result in the
|
| -// system call appearing to have succeeded, but without having any
|
| -// side effects.
|
| -SANDBOX_EXPORT ResultExpr Error(int err);
|
| -
|
| -// Trap specifies a result that the system call should be handled by
|
| -// trapping back into userspace and invoking |trap_func|, passing
|
| -// |aux| as the second parameter.
|
| -SANDBOX_EXPORT ResultExpr Trap(::sandbox::Trap::TrapFnc trap_func, void* aux);
|
| -
|
| -template <typename T>
|
| -class SANDBOX_EXPORT Arg {
|
| - public:
|
| - // Initializes the Arg to represent the |num|th system call
|
| - // argument (indexed from 0), which is of type |T|.
|
| - explicit Arg(int num) : num_(num), mask_(-1) {}
|
| -
|
| - Arg(const Arg& arg) : num_(arg.num_), mask_(arg.mask_) {}
|
| -
|
| - // Returns an Arg representing the current argument, but after
|
| - // bitwise-and'ing it with |rhs|.
|
| - Arg operator&(uint64_t rhs) const { return Arg(num_, mask_ & rhs); }
|
| -
|
| - // Returns a boolean expression comparing whether the system call
|
| - // argument (after applying any bitmasks, if appropriate) equals |rhs|.
|
| - BoolExpr operator==(T rhs) const;
|
| -
|
| - private:
|
| - Arg(int num, uint64_t mask) : num_(num), mask_(mask) {}
|
| - int num_;
|
| - uint64_t mask_;
|
| - DISALLOW_ASSIGN(Arg);
|
| -};
|
| -
|
| -// Various ways to combine boolean expressions into more complex expressions.
|
| -// They follow standard boolean algebra laws.
|
| -SANDBOX_EXPORT BoolExpr operator!(BoolExpr cond);
|
| -SANDBOX_EXPORT BoolExpr operator&&(BoolExpr lhs, BoolExpr rhs);
|
| -SANDBOX_EXPORT BoolExpr operator||(BoolExpr lhs, BoolExpr rhs);
|
| -
|
| -// If begins a conditional result expression predicated on the
|
| -// specified boolean expression.
|
| -SANDBOX_EXPORT Elser If(BoolExpr cond, ResultExpr then_result);
|
| -
|
| -class SANDBOX_EXPORT Elser {
|
| - public:
|
| - Elser(const Elser& elser);
|
| - ~Elser();
|
| -
|
| - // ElseIf extends the conditional result expression with another
|
| - // "if then" clause, predicated on the specified boolean expression.
|
| - Elser ElseIf(BoolExpr cond, ResultExpr then_result) const;
|
| -
|
| - // Else terminates a conditional result expression using |else_result| as
|
| - // the default fallback result expression.
|
| - ResultExpr Else(ResultExpr else_result) const;
|
| -
|
| - private:
|
| - typedef std::pair<BoolExpr, ResultExpr> Clause;
|
| - explicit Elser(Cons<Clause>::List clause_list);
|
| - Cons<Clause>::List clause_list_;
|
| - friend Elser If(BoolExpr, ResultExpr);
|
| - DISALLOW_ASSIGN(Elser);
|
| -};
|
| -
|
| -// =====================================================================
|
| -// Official API ends here.
|
| -// =====================================================================
|
| -
|
| -// Definitions below are necessary here only for C++03 compatibility.
|
| -// Once C++11 is available, they should be moved into bpf_dsl.cc via extern
|
| -// templates.
|
| -namespace internal {
|
| -
|
| -// Returns a boolean expression that represents whether system call
|
| -// argument |num| of size |size| is equal to |val|, when masked
|
| -// according to |mask|. Users should use the Arg template class below
|
| -// instead of using this API directly.
|
| -SANDBOX_EXPORT BoolExpr
|
| - ArgEq(int num, size_t size, uint64_t mask, uint64_t val);
|
| -
|
| -// Internal interface implemented by BoolExpr implementations.
|
| -class SANDBOX_EXPORT BoolExprImpl : public base::RefCounted<BoolExprImpl> {
|
| - public:
|
| - BoolExprImpl() {}
|
| - virtual ErrorCode Compile(SandboxBPF* sb,
|
| - ErrorCode true_ec,
|
| - ErrorCode false_ec) const = 0;
|
| -
|
| - protected:
|
| - virtual ~BoolExprImpl() {}
|
| -
|
| - private:
|
| - friend class base::RefCounted<BoolExprImpl>;
|
| - DISALLOW_COPY_AND_ASSIGN(BoolExprImpl);
|
| -};
|
| -
|
| -// Internal interface implemented by ResultExpr implementations.
|
| -class SANDBOX_EXPORT ResultExprImpl : public base::RefCounted<ResultExprImpl> {
|
| - public:
|
| - ResultExprImpl() {}
|
| - virtual ErrorCode Compile(SandboxBPF* sb) const = 0;
|
| -
|
| - protected:
|
| - virtual ~ResultExprImpl() {}
|
| -
|
| - private:
|
| - friend class base::RefCounted<ResultExprImpl>;
|
| - DISALLOW_COPY_AND_ASSIGN(ResultExprImpl);
|
| -};
|
| -
|
| -} // namespace internal
|
| -
|
| -// Definition requires ArgEq to have been declared. Moved out-of-line
|
| -// to minimize how much internal clutter users have to ignore while
|
| -// reading the header documentation.
|
| -template <typename T>
|
| -BoolExpr Arg<T>::operator==(T rhs) const {
|
| - return internal::ArgEq(num_, sizeof(T), mask_, static_cast<uint64_t>(rhs));
|
| -}
|
| -
|
| -} // namespace bpf_dsl
|
| -} // namespace sandbox
|
| -
|
| -#endif // SANDBOX_LINUX_BPF_DSL_BPF_DSL_H_
|
|
|