| Index: sandbox/linux/seccomp-bpf-helpers/bpf_dsl.cc
|
| diff --git a/sandbox/linux/seccomp-bpf-helpers/bpf_dsl.cc b/sandbox/linux/seccomp-bpf-helpers/bpf_dsl.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8cafdd7038cc2e6dd0e9f21f9140c007a267e848
|
| --- /dev/null
|
| +++ b/sandbox/linux/seccomp-bpf-helpers/bpf_dsl.cc
|
| @@ -0,0 +1,132 @@
|
| +// 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.
|
| +
|
| +#include "sandbox/linux/seccomp-bpf-helpers/bpf_dsl.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#include "sandbox/linux/seccomp-bpf/errorcode.h"
|
| +#include "sandbox/linux/seccomp-bpf/sandbox_bpf.h"
|
| +
|
| +namespace sandbox {
|
| +
|
| +namespace bpfdsl {
|
| +
|
| +namespace {
|
| +
|
| +class BasicCondImpl : public CondImpl {
|
| + public:
|
| + BasicCondImpl(int argno,
|
| + ErrorCode::ArgType is_32bit,
|
| + ErrorCode::Operation op,
|
| + uint64_t value)
|
| + : argno_(argno), is_32bit_(is_32bit), op_(op), value_(value) {}
|
| + virtual ErrorCode Compile(SandboxBPF* sb,
|
| + ErrorCode true_ec,
|
| + ErrorCode false_ec) const OVERRIDE {
|
| + return sb->Cond(argno_, is_32bit_, op_, value_, true_ec, false_ec);
|
| + }
|
| +
|
| + private:
|
| + virtual ~BasicCondImpl() {}
|
| + int argno_;
|
| + ErrorCode::ArgType is_32bit_;
|
| + ErrorCode::Operation op_;
|
| + uint64_t value_;
|
| + DISALLOW_COPY_AND_ASSIGN(BasicCondImpl);
|
| +};
|
| +
|
| +class AndCondImpl : public CondImpl {
|
| + public:
|
| + AndCondImpl(Cond lhs, Cond rhs) : lhs_(lhs), rhs_(rhs) {}
|
| + virtual ErrorCode Compile(SandboxBPF* sb,
|
| + ErrorCode true_ec,
|
| + ErrorCode false_ec) const OVERRIDE {
|
| + return lhs_->Compile(sb, rhs_->Compile(sb, true_ec, false_ec), false_ec);
|
| + }
|
| +
|
| + private:
|
| + virtual ~AndCondImpl() {}
|
| + Cond lhs_, rhs_;
|
| + DISALLOW_COPY_AND_ASSIGN(AndCondImpl);
|
| +};
|
| +
|
| +class OrCondImpl : public CondImpl {
|
| + public:
|
| + OrCondImpl(Cond lhs, Cond rhs) : lhs_(lhs), rhs_(rhs) {}
|
| + virtual ErrorCode Compile(SandboxBPF* sb,
|
| + ErrorCode true_ec,
|
| + ErrorCode false_ec) const OVERRIDE {
|
| + return lhs_->Compile(sb, true_ec, rhs_->Compile(sb, true_ec, false_ec));
|
| + }
|
| +
|
| + private:
|
| + virtual ~OrCondImpl() {}
|
| + Cond lhs_, rhs_;
|
| + DISALLOW_COPY_AND_ASSIGN(OrCondImpl);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +Cond operator&&(Cond lhs, Cond rhs) {
|
| + return Cond(new AndCondImpl(lhs, rhs));
|
| +}
|
| +
|
| +Cond operator||(Cond lhs, Cond rhs) {
|
| + return Cond(new OrCondImpl(lhs, rhs));
|
| +}
|
| +
|
| +Iffer::Iffer(SandboxBPF* sb) : sb_(sb) {
|
| + DCHECK(sb);
|
| +}
|
| +
|
| +Iffer::Iffer(const Iffer& iffer) : sb_(iffer.sb_) {
|
| +}
|
| +
|
| +Thener Iffer::If(Cond cond) const {
|
| + return Thener(sb_, cond);
|
| +}
|
| +
|
| +Thener::Thener(SandboxBPF* sb, Cond cond) : sb_(sb), cond_(cond) {
|
| +}
|
| +
|
| +Thener::~Thener() {}
|
| +
|
| +Elser Thener::Then(ErrorCode true_ec) const {
|
| + return Elser(sb_, cond_, true_ec);
|
| +}
|
| +
|
| +Elser::Elser(SandboxBPF* sb, Cond cond, ErrorCode true_ec)
|
| + : sb_(sb), cond_(cond), true_ec_(true_ec) {
|
| +}
|
| +
|
| +Elser::~Elser() {}
|
| +
|
| +ErrorCode Elser::Else(ErrorCode false_ec) const {
|
| + return cond_->Compile(sb_, true_ec_, false_ec);
|
| +}
|
| +
|
| +} // namespace bpfdsl
|
| +
|
| +bpfdsl::Iffer DSL(SandboxBPF* sb) {
|
| + return bpfdsl::Iffer(sb);
|
| +}
|
| +
|
| +template <typename T>
|
| +Arg<T>::Arg(int num)
|
| + : num_(num) {
|
| + DCHECK(num >= 0 && num < 6);
|
| +}
|
| +
|
| +template <typename T>
|
| +bpfdsl::Cond Arg<T>::operator==(const T& rhs) const {
|
| + const ErrorCode::ArgType arg_type =
|
| + (sizeof(T) <= 4) ? ErrorCode::TP_32BIT : ErrorCode::TP_64BIT;
|
| + return bpfdsl::Cond(
|
| + new bpfdsl::BasicCondImpl(num_, arg_type, ErrorCode::OP_EQUAL, rhs));
|
| +}
|
| +
|
| +template class Arg<int>;
|
| +
|
| +} // sandbox
|
|
|