| Index: sandbox/linux/bpf_dsl/bpf_dsl.cc
|
| diff --git a/sandbox/linux/bpf_dsl/bpf_dsl.cc b/sandbox/linux/bpf_dsl/bpf_dsl.cc
|
| index 8b343f981103b47d64898ecba448b9c3c9ca94bc..dd8eab6c140137217500e64fc32ac415a5ab1afb 100644
|
| --- a/sandbox/linux/bpf_dsl/bpf_dsl.cc
|
| +++ b/sandbox/linux/bpf_dsl/bpf_dsl.cc
|
| @@ -12,6 +12,7 @@
|
| #include "base/memory/ref_counted.h"
|
| #include "sandbox/linux/seccomp-bpf/errorcode.h"
|
| #include "sandbox/linux/seccomp-bpf/sandbox_bpf.h"
|
| +#include "sandbox/linux/seccomp-bpf/syscall_iterator.h"
|
|
|
| namespace sandbox {
|
| namespace bpf_dsl {
|
| @@ -38,7 +39,7 @@ class ErrorResultExprImpl : public internal::ResultExprImpl {
|
| }
|
|
|
| virtual ErrorCode Compile(SandboxBPF* sb) const override {
|
| - return ErrorCode(err_);
|
| + return sb->Error(err_);
|
| }
|
|
|
| private:
|
| @@ -112,6 +113,8 @@ class UnsafeTrapResultExprImpl : public internal::ResultExprImpl {
|
| return sb->UnsafeTrap(func_, arg_);
|
| }
|
|
|
| + virtual bool HasUnsafeTraps() const override { return true; }
|
| +
|
| private:
|
| virtual ~UnsafeTrapResultExprImpl() {}
|
|
|
| @@ -133,6 +136,10 @@ class IfThenResultExprImpl : public internal::ResultExprImpl {
|
| sb, then_result_->Compile(sb), else_result_->Compile(sb));
|
| }
|
|
|
| + virtual bool HasUnsafeTraps() const override {
|
| + return then_result_->HasUnsafeTraps() || else_result_->HasUnsafeTraps();
|
| + }
|
| +
|
| private:
|
| virtual ~IfThenResultExprImpl() {}
|
|
|
| @@ -249,6 +256,10 @@ class OrBoolExprImpl : public internal::BoolExprImpl {
|
|
|
| namespace internal {
|
|
|
| +bool ResultExprImpl::HasUnsafeTraps() const {
|
| + return false;
|
| +}
|
| +
|
| uint64_t DefaultMask(size_t size) {
|
| switch (size) {
|
| case 4:
|
| @@ -376,6 +387,17 @@ ErrorCode SandboxBPFDSLPolicy::InvalidSyscall(SandboxBPF* sb) const {
|
| return InvalidSyscall()->Compile(sb);
|
| }
|
|
|
| +bool SandboxBPFDSLPolicy::HasUnsafeTraps() const {
|
| + for (SyscallIterator iter(false); !iter.Done();) {
|
| + uint32_t sysnum = iter.Next();
|
| + if (SyscallIterator::IsValid(sysnum) &&
|
| + EvaluateSyscall(sysnum)->HasUnsafeTraps()) {
|
| + return true;
|
| + }
|
| + }
|
| + return InvalidSyscall()->HasUnsafeTraps();
|
| +}
|
| +
|
| ResultExpr SandboxBPFDSLPolicy::Trap(Trap::TrapFnc trap_func, const void* aux) {
|
| return bpf_dsl::Trap(trap_func, aux);
|
| }
|
|
|