Chromium Code Reviews| 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 8144d805490722e9806d85d3e079f0154a322696..983c9056397e1661a92325fa45d23f10d74dd377 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,16 @@ 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()) |
|
jln (very slow on Chromium)
2014/10/08 17:31:32
Nit: {}
mdempsky
2014/10/08 17:34:19
Done.
|
| + return true; |
| + } |
| + return InvalidSyscall()->HasUnsafeTraps(); |
| +} |
| + |
| ResultExpr SandboxBPFDSLPolicy::Trap(Trap::TrapFnc trap_func, const void* aux) { |
| return bpf_dsl::Trap(trap_func, aux); |
| } |