Index: sandbox/linux/bpf_dsl/verifier.cc |
diff --git a/sandbox/linux/seccomp-bpf/verifier.cc b/sandbox/linux/bpf_dsl/verifier.cc |
similarity index 89% |
rename from sandbox/linux/seccomp-bpf/verifier.cc |
rename to sandbox/linux/bpf_dsl/verifier.cc |
index e533b2d91493bad8f2baffa568ea254df425d591..adbc960faf606ec7545337f5b3d0e50f4da25649 100644 |
--- a/sandbox/linux/seccomp-bpf/verifier.cc |
+++ b/sandbox/linux/bpf_dsl/verifier.cc |
@@ -2,7 +2,7 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "sandbox/linux/seccomp-bpf/verifier.h" |
+#include "sandbox/linux/bpf_dsl/verifier.h" |
#include <string.h> |
@@ -15,16 +15,15 @@ |
#include "sandbox/linux/bpf_dsl/seccomp_macros.h" |
#include "sandbox/linux/bpf_dsl/syscall_set.h" |
#include "sandbox/linux/seccomp-bpf/errorcode.h" |
-#include "sandbox/linux/seccomp-bpf/sandbox_bpf.h" |
#include "sandbox/linux/system_headers/linux_seccomp.h" |
namespace sandbox { |
+namespace bpf_dsl { |
namespace { |
const uint64_t kLower32Bits = std::numeric_limits<uint32_t>::max(); |
const uint64_t kUpper32Bits = static_cast<uint64_t>(kLower32Bits) << 32; |
-const uint64_t kFull64Bits = std::numeric_limits<uint64_t>::max(); |
struct State { |
State(const std::vector<struct sock_filter>& p, |
@@ -54,8 +53,8 @@ uint32_t EvaluateErrorCode(bpf_dsl::PolicyCompiler* compiler, |
return compiler->Unexpected64bitArgument().err(); |
} |
bool equal = (data.args[code.argno()] & code.mask()) == code.value(); |
- return EvaluateErrorCode( |
- compiler, equal ? *code.passed() : *code.failed(), data); |
+ return EvaluateErrorCode(compiler, equal ? *code.passed() : *code.failed(), |
+ data); |
} else { |
return SECCOMP_RET_INVALID; |
} |
@@ -69,10 +68,12 @@ bool VerifyErrorCode(bpf_dsl::PolicyCompiler* compiler, |
const char** err) { |
if (code.error_type() == ErrorCode::ET_SIMPLE || |
code.error_type() == ErrorCode::ET_TRAP) { |
- uint32_t computed_ret = Verifier::EvaluateBPF(program, *data, err); |
+ const uint32_t computed_ret = Verifier::EvaluateBPF(program, *data, err); |
if (*err) { |
return false; |
- } else if (computed_ret != EvaluateErrorCode(compiler, root_code, *data)) { |
+ } |
+ const uint32_t policy_ret = EvaluateErrorCode(compiler, root_code, *data); |
+ if (computed_ret != policy_ret) { |
// For efficiency's sake, we'd much rather compare "computed_ret" |
// against "code.err()". This works most of the time, but it doesn't |
// always work for nested conditional expressions. The test values |
@@ -97,8 +98,8 @@ bool VerifyErrorCode(bpf_dsl::PolicyCompiler* compiler, |
// Verify that we can check a value for simple equality. |
data->args[code.argno()] = code.value(); |
- if (!VerifyErrorCode( |
- compiler, program, data, root_code, *code.passed(), err)) { |
+ if (!VerifyErrorCode(compiler, program, data, root_code, *code.passed(), |
+ err)) { |
return false; |
} |
@@ -110,15 +111,15 @@ bool VerifyErrorCode(bpf_dsl::PolicyCompiler* compiler, |
} |
if ((ignored_bits & kLower32Bits) != 0) { |
data->args[code.argno()] = code.value() | (ignored_bits & kLower32Bits); |
- if (!VerifyErrorCode( |
- compiler, program, data, root_code, *code.passed(), err)) { |
+ if (!VerifyErrorCode(compiler, program, data, root_code, *code.passed(), |
+ err)) { |
return false; |
} |
} |
if ((ignored_bits & kUpper32Bits) != 0) { |
data->args[code.argno()] = code.value() | (ignored_bits & kUpper32Bits); |
- if (!VerifyErrorCode( |
- compiler, program, data, root_code, *code.passed(), err)) { |
+ if (!VerifyErrorCode(compiler, program, data, root_code, *code.passed(), |
+ err)) { |
return false; |
} |
} |
@@ -126,15 +127,15 @@ bool VerifyErrorCode(bpf_dsl::PolicyCompiler* compiler, |
// Verify that changing bits included in the mask is detected as inequality. |
if ((code.mask() & kLower32Bits) != 0) { |
data->args[code.argno()] = code.value() ^ (code.mask() & kLower32Bits); |
- if (!VerifyErrorCode( |
- compiler, program, data, root_code, *code.failed(), err)) { |
+ if (!VerifyErrorCode(compiler, program, data, root_code, *code.failed(), |
+ err)) { |
return false; |
} |
} |
if ((code.mask() & kUpper32Bits) != 0) { |
data->args[code.argno()] = code.value() ^ (code.mask() & kUpper32Bits); |
- if (!VerifyErrorCode( |
- compiler, program, data, root_code, *code.failed(), err)) { |
+ if (!VerifyErrorCode(compiler, program, data, root_code, *code.failed(), |
+ err)) { |
return false; |
} |
} |
@@ -145,24 +146,16 @@ bool VerifyErrorCode(bpf_dsl::PolicyCompiler* compiler, |
// Arbitrary 64-bit values should be rejected. |
data->args[code.argno()] = 1ULL << 32; |
- if (!VerifyErrorCode(compiler, |
- program, |
- data, |
- root_code, |
- compiler->Unexpected64bitArgument(), |
- err)) { |
+ if (!VerifyErrorCode(compiler, program, data, root_code, |
+ compiler->Unexpected64bitArgument(), err)) { |
return false; |
} |
// Upper 32-bits set without the MSB of the lower 32-bits set should be |
// rejected too. |
data->args[code.argno()] = kUpper32Bits; |
- if (!VerifyErrorCode(compiler, |
- program, |
- data, |
- root_code, |
- compiler->Unexpected64bitArgument(), |
- err)) { |
+ if (!VerifyErrorCode(compiler, program, data, root_code, |
+ compiler->Unexpected64bitArgument(), err)) { |
return false; |
} |
} |
@@ -182,8 +175,7 @@ void Ld(State* state, const struct sock_filter& insn, const char** err) { |
if (insn.k < sizeof(struct arch_seccomp_data) && (insn.k & 3) == 0) { |
// We only allow loading of properly aligned 32bit quantities. |
memcpy(&state->accumulator, |
- reinterpret_cast<const char*>(&state->data) + insn.k, |
- 4); |
+ reinterpret_cast<const char*>(&state->data) + insn.k, 4); |
} else { |
*err = "Invalid operand in BPF_LD instruction"; |
return; |
@@ -399,4 +391,5 @@ uint32_t Verifier::EvaluateBPF(const std::vector<struct sock_filter>& program, |
return 0; |
} |
+} // namespace bpf_dsl |
} // namespace sandbox |