Lines Matching refs:code
2 // Use of this source code is governed by a BSD-style license that can be
38 uint32_t EvaluateErrorCode(Sandbox *sandbox, const ErrorCode& code,
40 if (code.error_type() == ErrorCode::ET_SIMPLE ||
41 code.error_type() == ErrorCode::ET_TRAP) {
42 return code.err();
43 } else if (code.error_type() == ErrorCode::ET_COND) {
44 if (code.width() == ErrorCode::TP_32BIT &&
45 (data.args[code.argno()] >> 32) &&
46 (data.args[code.argno()] & 0xFFFFFFFF80000000ull) !=
50 switch (code.op()) {
53 (code.width() == ErrorCode::TP_32BIT
54 ? uint32_t(data.args[code.argno()])
55 : data.args[code.argno()]) == code.value()
56 ? *code.passed()
57 : *code.failed(),
61 ((code.width() == ErrorCode::TP_32BIT
62 ? uint32_t(data.args[code.argno()])
63 : data.args[code.argno()]) & code.value())
64 == code.value()
65 ? *code.passed()
66 : *code.failed(),
70 (code.width() == ErrorCode::TP_32BIT
71 ? uint32_t(data.args[code.argno()])
72 : data.args[code.argno()]) & code.value()
73 ? *code.passed()
74 : *code.failed(),
88 const ErrorCode& code,
90 if (code.error_type() == ErrorCode::ET_SIMPLE ||
91 code.error_type() == ErrorCode::ET_TRAP) {
97 // against "code.err()". This works most of the time, but it doesn't
100 // code flow decisions in multiple nodes of the decision tree, and the
101 // only way to compute the correct error code in that situation is by
103 *err = "Exit code from BPF program doesn't match";
106 } else if (code.error_type() == ErrorCode::ET_COND) {
107 if (code.argno() < 0 || code.argno() >= 6) {
108 *err = "Invalid argument number in error code";
111 switch (code.op()) {
115 data->args[code.argno()] = code.value();
117 *code.passed(), err)) {
123 data->args[code.argno()] = code.value() ^ 0x55AA55AA;
125 *code.failed(), err)) {
132 if (code.width() == ErrorCode::TP_32BIT) {
133 if (code.value() >> 32) {
141 data->args[code.argno()] = 0x100000000ull;
154 data->args[code.argno()] = code.value() ^ 0x55AA55AA00000000ull;
156 *code.failed(), err)) {
173 (!code.value() && code.op() == ErrorCode::OP_HAS_ANY_BITS) ||
178 ((code.value() & ~uint64_t(uintptr_t(-1))) &&
179 code.op() == ErrorCode::OP_HAS_ALL_BITS) ||
180 (code.value() && !(code.value() & uintptr_t(-1)) &&
181 code.op() == ErrorCode::OP_HAS_ANY_BITS)
183 ? *code.failed() : *code.passed();
188 !code.value() && code.op() == ErrorCode::OP_HAS_ALL_BITS
189 ? *code.passed() : *code.failed();
191 data->args[code.argno()] = code.value() & uintptr_t(-1);
195 data->args[code.argno()] = uintptr_t(-1);
199 data->args[code.argno()] = 0;
206 *err = "Unsupported operation in conditional error code";
210 *err = "Attempting to return invalid error code from BPF program";
217 if (BPF_SIZE(insn.code) != BPF_W ||
218 BPF_MODE(insn.code) != BPF_ABS) {
236 if (BPF_OP(insn.code) == BPF_JA) {
245 if (BPF_SRC(insn.code) != BPF_K ||
251 switch (BPF_OP(insn.code)) {
287 if (BPF_SRC(insn.code) != BPF_K) {
295 if (BPF_OP(insn.code) == BPF_NEG) {
299 if (BPF_SRC(insn.code) != BPF_K) {
303 switch (BPF_OP(insn.code)) {
380 // our BPF program will make us fail with a misleading error code.
394 ErrorCode code = evaluate_syscall(sandbox, sysnum, aux);
395 if (!VerifyErrorCode(sandbox, program, &data, code, code, err)) {
416 switch (BPF_CLASS(insn.code)) {
434 *err = "Unexpected return code found in BPF program";