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); |
} |