| Index: sandbox/linux/bpf_dsl/policy_compiler.h
|
| diff --git a/sandbox/linux/bpf_dsl/policy_compiler.h b/sandbox/linux/bpf_dsl/policy_compiler.h
|
| index f0979417663246bce22006aa6941a416787922da..e81404fb57073dcdec98fd63df7b68d3d2318d1a 100644
|
| --- a/sandbox/linux/bpf_dsl/policy_compiler.h
|
| +++ b/sandbox/linux/bpf_dsl/policy_compiler.h
|
| @@ -7,15 +7,12 @@
|
|
|
| #include <stdint.h>
|
|
|
| -#include <map>
|
| -#include <set>
|
| #include <vector>
|
|
|
| #include "base/macros.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "sandbox/linux/bpf_dsl/bpf_dsl_forward.h"
|
| #include "sandbox/linux/bpf_dsl/codegen.h"
|
| -#include "sandbox/linux/bpf_dsl/errorcode.h"
|
| #include "sandbox/linux/bpf_dsl/trap_registry.h"
|
| #include "sandbox/sandbox_export.h"
|
|
|
| @@ -47,49 +44,42 @@ class SANDBOX_EXPORT PolicyCompiler {
|
| // TODO(mdempsky): Move this into Policy?
|
| void SetPanicFunc(PanicFunc panic_func);
|
|
|
| - // Error returns an ErrorCode to indicate the system call should fail with
|
| - // the specified error number.
|
| - ErrorCode Error(int err);
|
| -
|
| - // Trap returns an ErrorCode to indicate the system call should
|
| - // instead invoke a trap handler.
|
| - ErrorCode Trap(TrapRegistry::TrapFnc fnc, const void* aux, bool safe);
|
| -
|
| // UnsafeTraps require some syscalls to always be allowed.
|
| // This helper function returns true for these calls.
|
| static bool IsRequiredForUnsafeTrap(int sysno);
|
|
|
| - // We can also use ErrorCode to request evaluation of a conditional
|
| - // statement based on inspection of system call parameters.
|
| - // This method wrap an ErrorCode object around the conditional statement.
|
| + // Functions below are meant for use within bpf_dsl itself.
|
| +
|
| + // Return returns a CodeGen::Node that returns the specified seccomp
|
| + // return value.
|
| + CodeGen::Node Return(uint32_t ret);
|
| +
|
| + // Trap returns a CodeGen::Node to indicate the system call should
|
| + // instead invoke a trap handler.
|
| + CodeGen::Node Trap(TrapRegistry::TrapFnc fnc, const void* aux, bool safe);
|
| +
|
| + // MaskedEqual returns a CodeGen::Node that represents a conditional branch.
|
| // Argument "argno" (1..6) will be bitwise-AND'd with "mask" and compared
|
| - // to "value"; if equal, then "passed" will be returned, otherwise "failed".
|
| - // If "is32bit" is set, the argument must in the range of 0x0..(1u << 32 - 1)
|
| + // to "value"; if equal, then "passed" will be executed, otherwise "failed".
|
| + // If "width" is 4, the argument must in the range of 0x0..(1u << 32 - 1)
|
| // If it is outside this range, the sandbox treats the system call just
|
| - // the same as any other ABI violation (i.e. it aborts with an error
|
| - // message).
|
| - ErrorCode CondMaskedEqual(int argno,
|
| - ErrorCode::ArgType is_32bit,
|
| + // the same as any other ABI violation (i.e., it panics).
|
| + CodeGen::Node MaskedEqual(int argno,
|
| + size_t width,
|
| uint64_t mask,
|
| uint64_t value,
|
| - const ErrorCode& passed,
|
| - const ErrorCode& failed);
|
| -
|
| - // Returns the fatal ErrorCode that is used to indicate that somebody
|
| - // attempted to pass a 64bit value in a 32bit system call argument.
|
| - // This method is primarily needed for testing purposes.
|
| - ErrorCode Unexpected64bitArgument();
|
| + CodeGen::Node passed,
|
| + CodeGen::Node failed);
|
|
|
| private:
|
| struct Range;
|
| typedef std::vector<Range> Ranges;
|
| - typedef std::set<ErrorCode, struct ErrorCode::LessThan> Conds;
|
|
|
| - // Used by CondExpressionHalf to track which half of the argument it's
|
| + // Used by MaskedEqualHalf to track which half of the argument it's
|
| // emitting instructions for.
|
| - enum ArgHalf {
|
| - LowerHalf,
|
| - UpperHalf,
|
| + enum class ArgHalf {
|
| + LOWER,
|
| + UPPER,
|
| };
|
|
|
| // Compile the configured policy into a complete instruction sequence.
|
| @@ -118,7 +108,8 @@ class SANDBOX_EXPORT PolicyCompiler {
|
|
|
| // Finds all the ranges of system calls that need to be handled. Ranges are
|
| // sorted in ascending order of system call numbers. There are no gaps in the
|
| - // ranges. System calls with identical ErrorCodes are coalesced into a single
|
| + // ranges. System calls with identical CodeGen::Nodes are coalesced into a
|
| + // single
|
| // range.
|
| void FindRanges(Ranges* ranges);
|
|
|
| @@ -131,32 +122,25 @@ class SANDBOX_EXPORT PolicyCompiler {
|
| // CodeGen node.
|
| CodeGen::Node CompileResult(const ResultExpr& res);
|
|
|
| - // Returns a BPF program snippet that makes the BPF filter program exit
|
| - // with the given ErrorCode "err". N.B. the ErrorCode may very well be a
|
| - // conditional expression; if so, this function will recursively call
|
| - // CondExpression() and possibly RetExpression() to build a complex set of
|
| - // instructions.
|
| - CodeGen::Node RetExpression(const ErrorCode& err);
|
| -
|
| - // Returns a BPF program that evaluates the conditional expression in
|
| - // "cond" and returns the appropriate value from the BPF filter program.
|
| - // This function recursively calls RetExpression(); it should only ever be
|
| - // called from RetExpression().
|
| - CodeGen::Node CondExpression(const ErrorCode& cond);
|
| -
|
| // Returns a BPF program that evaluates half of a conditional expression;
|
| // it should only ever be called from CondExpression().
|
| - CodeGen::Node CondExpressionHalf(const ErrorCode& cond,
|
| - ArgHalf half,
|
| - CodeGen::Node passed,
|
| - CodeGen::Node failed);
|
| + CodeGen::Node MaskedEqualHalf(int argno,
|
| + size_t width,
|
| + uint64_t full_mask,
|
| + uint64_t full_value,
|
| + ArgHalf half,
|
| + CodeGen::Node passed,
|
| + CodeGen::Node failed);
|
| +
|
| + // Returns the fatal CodeGen::Node that is used to indicate that somebody
|
| + // attempted to pass a 64bit value in a 32bit system call argument.
|
| + CodeGen::Node Unexpected64bitArgument();
|
|
|
| const Policy* policy_;
|
| TrapRegistry* registry_;
|
| uint64_t escapepc_;
|
| PanicFunc panic_func_;
|
|
|
| - Conds conds_;
|
| CodeGen gen_;
|
| bool has_unsafe_traps_;
|
|
|
|
|