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