1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "sandbox/linux/bpf_dsl/bpf_dsl.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <errno.h>
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <limits>
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/logging.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/ref_counted.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "sandbox/linux/seccomp-bpf/errorcode.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "sandbox/linux/seccomp-bpf/sandbox_bpf.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace sandbox {
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace bpf_dsl {
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass AllowResultExprImpl : public internal::ResultExprImpl {
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AllowResultExprImpl() {}
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ErrorCode Compile(SandboxBPF* sb) const OVERRIDE {
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return ErrorCode(ErrorCode::ERR_ALLOWED);
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~AllowResultExprImpl() {}
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(AllowResultExprImpl);
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ErrorResultExprImpl : public internal::ResultExprImpl {
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  explicit ErrorResultExprImpl(int err) : err_(err) {
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CHECK(err_ >= ErrorCode::ERR_MIN_ERRNO && err_ <= ErrorCode::ERR_MAX_ERRNO);
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ErrorCode Compile(SandboxBPF* sb) const OVERRIDE {
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return ErrorCode(err_);
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~ErrorResultExprImpl() {}
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int err_;
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(ErrorResultExprImpl);
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass KillResultExprImpl : public internal::ResultExprImpl {
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit KillResultExprImpl(const char* msg) : msg_(msg) { DCHECK(msg_); }
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ErrorCode Compile(SandboxBPF* sb) const OVERRIDE {
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return sb->Kill(msg_);
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~KillResultExprImpl() {}
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char* msg_;
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(KillResultExprImpl);
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass TraceResultExprImpl : public internal::ResultExprImpl {
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TraceResultExprImpl(uint16_t aux) : aux_(aux) {}
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ErrorCode Compile(SandboxBPF* sb) const OVERRIDE {
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return ErrorCode(ErrorCode::ERR_TRACE + aux_);
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~TraceResultExprImpl() {}
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  uint16_t aux_;
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(TraceResultExprImpl);
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass TrapResultExprImpl : public internal::ResultExprImpl {
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TrapResultExprImpl(Trap::TrapFnc func, const void* arg)
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : func_(func), arg_(arg) {
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DCHECK(func_);
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ErrorCode Compile(SandboxBPF* sb) const OVERRIDE {
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return sb->Trap(func_, arg_);
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~TrapResultExprImpl() {}
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Trap::TrapFnc func_;
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const void* arg_;
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(TrapResultExprImpl);
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass UnsafeTrapResultExprImpl : public internal::ResultExprImpl {
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UnsafeTrapResultExprImpl(Trap::TrapFnc func, const void* arg)
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : func_(func), arg_(arg) {
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DCHECK(func_);
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ErrorCode Compile(SandboxBPF* sb) const OVERRIDE {
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return sb->UnsafeTrap(func_, arg_);
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~UnsafeTrapResultExprImpl() {}
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Trap::TrapFnc func_;
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const void* arg_;
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(UnsafeTrapResultExprImpl);
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass IfThenResultExprImpl : public internal::ResultExprImpl {
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  IfThenResultExprImpl(const BoolExpr& cond,
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const ResultExpr& then_result,
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const ResultExpr& else_result)
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      : cond_(cond), then_result_(then_result), else_result_(else_result) {}
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ErrorCode Compile(SandboxBPF* sb) const OVERRIDE {
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return cond_->Compile(
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        sb, then_result_->Compile(sb), else_result_->Compile(sb));
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~IfThenResultExprImpl() {}
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BoolExpr cond_;
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ResultExpr then_result_;
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ResultExpr else_result_;
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(IfThenResultExprImpl);
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ConstBoolExprImpl : public internal::BoolExprImpl {
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ConstBoolExprImpl(bool value) : value_(value) {}
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ErrorCode Compile(SandboxBPF* sb,
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            ErrorCode true_ec,
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            ErrorCode false_ec) const OVERRIDE {
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return value_ ? true_ec : false_ec;
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~ConstBoolExprImpl() {}
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool value_;
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(ConstBoolExprImpl);
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass PrimitiveBoolExprImpl : public internal::BoolExprImpl {
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PrimitiveBoolExprImpl(int argno,
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        ErrorCode::ArgType is_32bit,
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        uint64_t mask,
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        uint64_t value)
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : argno_(argno), is_32bit_(is_32bit), mask_(mask), value_(value) {}
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ErrorCode Compile(SandboxBPF* sb,
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            ErrorCode true_ec,
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            ErrorCode false_ec) const OVERRIDE {
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return sb->CondMaskedEqual(
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        argno_, is_32bit_, mask_, value_, true_ec, false_ec);
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~PrimitiveBoolExprImpl() {}
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int argno_;
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ErrorCode::ArgType is_32bit_;
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  uint64_t mask_;
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  uint64_t value_;
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(PrimitiveBoolExprImpl);
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass NegateBoolExprImpl : public internal::BoolExprImpl {
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit NegateBoolExprImpl(const BoolExpr& cond) : cond_(cond) {}
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ErrorCode Compile(SandboxBPF* sb,
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            ErrorCode true_ec,
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            ErrorCode false_ec) const OVERRIDE {
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return cond_->Compile(sb, false_ec, true_ec);
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~NegateBoolExprImpl() {}
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BoolExpr cond_;
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(NegateBoolExprImpl);
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass AndBoolExprImpl : public internal::BoolExprImpl {
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AndBoolExprImpl(const BoolExpr& lhs, const BoolExpr& rhs)
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : lhs_(lhs), rhs_(rhs) {}
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ErrorCode Compile(SandboxBPF* sb,
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            ErrorCode true_ec,
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            ErrorCode false_ec) const OVERRIDE {
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return lhs_->Compile(sb, rhs_->Compile(sb, true_ec, false_ec), false_ec);
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~AndBoolExprImpl() {}
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BoolExpr lhs_;
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BoolExpr rhs_;
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(AndBoolExprImpl);
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass OrBoolExprImpl : public internal::BoolExprImpl {
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  OrBoolExprImpl(const BoolExpr& lhs, const BoolExpr& rhs)
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : lhs_(lhs), rhs_(rhs) {}
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ErrorCode Compile(SandboxBPF* sb,
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            ErrorCode true_ec,
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            ErrorCode false_ec) const OVERRIDE {
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return lhs_->Compile(sb, true_ec, rhs_->Compile(sb, true_ec, false_ec));
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~OrBoolExprImpl() {}
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BoolExpr lhs_;
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BoolExpr rhs_;
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(OrBoolExprImpl);
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace internal {
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciuint64_t DefaultMask(size_t size) {
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (size) {
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case 4:
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return std::numeric_limits<uint32_t>::max();
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case 8:
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return std::numeric_limits<uint64_t>::max();
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CHECK(false) << "Unimplemented DefaultMask case";
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return 0;
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
264116680a4aac90f2aa7413d9095a592090648e557Ben MurdochBoolExpr ArgEq(int num, size_t size, uint64_t mask, uint64_t val) {
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(size == 4 || size == 8);
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // TODO(mdempsky): Should we just always use TP_64BIT?
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const ErrorCode::ArgType arg_type =
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (size == 4) ? ErrorCode::TP_32BIT : ErrorCode::TP_64BIT;
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return BoolExpr(new const PrimitiveBoolExprImpl(num, arg_type, mask, val));
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace internal
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
276116680a4aac90f2aa7413d9095a592090648e557Ben MurdochResultExpr Allow() {
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return ResultExpr(new const AllowResultExprImpl());
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
280116680a4aac90f2aa7413d9095a592090648e557Ben MurdochResultExpr Error(int err) {
281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return ResultExpr(new const ErrorResultExprImpl(err));
282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResultExpr Kill(const char* msg) {
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return ResultExpr(new const KillResultExprImpl(msg));
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResultExpr Trace(uint16_t aux) {
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return ResultExpr(new const TraceResultExprImpl(aux));
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResultExpr Trap(Trap::TrapFnc trap_func, const void* aux) {
293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return ResultExpr(new const TrapResultExprImpl(trap_func, aux));
294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResultExpr UnsafeTrap(Trap::TrapFnc trap_func, const void* aux) {
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return ResultExpr(new const UnsafeTrapResultExprImpl(trap_func, aux));
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBoolExpr BoolConst(bool value) {
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return BoolExpr(new const ConstBoolExprImpl(value));
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBoolExpr operator!(const BoolExpr& cond) {
305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return BoolExpr(new const NegateBoolExprImpl(cond));
306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBoolExpr operator&&(const BoolExpr& lhs, const BoolExpr& rhs) {
309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return BoolExpr(new const AndBoolExprImpl(lhs, rhs));
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBoolExpr operator||(const BoolExpr& lhs, const BoolExpr& rhs) {
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return BoolExpr(new const OrBoolExprImpl(lhs, rhs));
314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciElser If(const BoolExpr& cond, const ResultExpr& then_result) {
317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return Elser(Cons<Elser::Clause>::List()).ElseIf(cond, then_result);
318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
320116680a4aac90f2aa7413d9095a592090648e557Ben MurdochElser::Elser(Cons<Clause>::List clause_list) : clause_list_(clause_list) {
321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
323116680a4aac90f2aa7413d9095a592090648e557Ben MurdochElser::Elser(const Elser& elser) : clause_list_(elser.clause_list_) {
324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
326116680a4aac90f2aa7413d9095a592090648e557Ben MurdochElser::~Elser() {
327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciElser Elser::ElseIf(const BoolExpr& cond, const ResultExpr& then_result) const {
330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return Elser(
331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      Cons<Clause>::Make(std::make_pair(cond, then_result), clause_list_));
332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResultExpr Elser::Else(const ResultExpr& else_result) const {
335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // We finally have the default result expression for this
336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // if/then/else sequence.  Also, we've already accumulated all
337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // if/then pairs into a list of reverse order (i.e., lower priority
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // conditions are listed before higher priority ones).  E.g., an
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // expression like
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //    If(b1, e1).ElseIf(b2, e2).ElseIf(b3, e3).Else(e4)
342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //
343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // will have built up a list like
344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //
345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //    [(b3, e3), (b2, e2), (b1, e1)].
346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //
347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Now that we have e4, we can walk the list and create a ResultExpr
348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // tree like:
349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //
350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //    expr = e4
351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //    expr = (b3 ? e3 : expr) = (b3 ? e3 : e4)
352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //    expr = (b2 ? e2 : expr) = (b2 ? e2 : (b3 ? e3 : e4))
353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //    expr = (b1 ? e1 : expr) = (b1 ? e1 : (b2 ? e2 : (b3 ? e3 : e4)))
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //
355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // and end up with an appropriately chained tree.
356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ResultExpr expr = else_result;
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (Cons<Clause>::List it = clause_list_; it.get(); it = it->tail()) {
359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Clause clause = it->head();
360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    expr = ResultExpr(
361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        new const IfThenResultExprImpl(clause.first, clause.second, expr));
362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return expr;
364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
366116680a4aac90f2aa7413d9095a592090648e557Ben MurdochResultExpr SandboxBPFDSLPolicy::InvalidSyscall() const {
367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return Error(ENOSYS);
368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
370116680a4aac90f2aa7413d9095a592090648e557Ben MurdochErrorCode SandboxBPFDSLPolicy::EvaluateSyscall(SandboxBPF* sb,
371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                               int sysno) const {
372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return EvaluateSyscall(sysno)->Compile(sb);
373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
375116680a4aac90f2aa7413d9095a592090648e557Ben MurdochErrorCode SandboxBPFDSLPolicy::InvalidSyscall(SandboxBPF* sb) const {
376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return InvalidSyscall()->Compile(sb);
377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResultExpr SandboxBPFDSLPolicy::Trap(Trap::TrapFnc trap_func, const void* aux) {
380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return bpf_dsl::Trap(trap_func, aux);
381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace bpf_dsl
384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace sandbox
385