Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/bpf: fix tests

Fix tests that assumed no loops.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>

authored by

Alexei Starovoitov and committed by
Daniel Borkmann
aeee380c eea1c227

+24 -20
+4 -7
tools/testing/selftests/bpf/test_verifier.c
··· 237 237 insn[i++] = BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 238 238 -8 * (k % 64 + 1)); 239 239 } 240 - /* every jump adds 1 step to insn_processed, so to stay exactly 241 - * within 1m limit add MAX_TEST_INSNS - MAX_JMP_SEQ - 1 MOVs and 1 EXIT 240 + /* is_state_visited() doesn't allocate state for pruning for every jump. 241 + * Hence multiply jmps by 4 to accommodate that heuristic 242 242 */ 243 - while (i < MAX_TEST_INSNS - MAX_JMP_SEQ - 1) 243 + while (i < MAX_TEST_INSNS - MAX_JMP_SEQ * 4) 244 244 insn[i++] = BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 42); 245 245 insn[i] = BPF_EXIT_INSN(); 246 246 self->prog_len = i + 1; ··· 269 269 insn[i++] = BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 270 270 -8 * (k % (64 - 4 * FUNC_NEST) + 1)); 271 271 } 272 - /* every jump adds 1 step to insn_processed, so to stay exactly 273 - * within 1m limit add MAX_TEST_INSNS - MAX_JMP_SEQ - 1 MOVs and 1 EXIT 274 - */ 275 - while (i < MAX_TEST_INSNS - MAX_JMP_SEQ - 1) 272 + while (i < MAX_TEST_INSNS - MAX_JMP_SEQ * 4) 276 273 insn[i++] = BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 42); 277 274 insn[i] = BPF_EXIT_INSN(); 278 275 self->prog_len = i + 1;
+13 -9
tools/testing/selftests/bpf/verifier/calls.c
··· 215 215 BPF_MOV64_IMM(BPF_REG_0, 3), 216 216 BPF_JMP_IMM(BPF_JA, 0, 0, -6), 217 217 }, 218 - .prog_type = BPF_PROG_TYPE_TRACEPOINT, 219 - .errstr = "back-edge from insn", 220 - .result = REJECT, 218 + .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 219 + .errstr_unpriv = "back-edge from insn", 220 + .result_unpriv = REJECT, 221 + .result = ACCEPT, 222 + .retval = 1, 221 223 }, 222 224 { 223 225 "calls: conditional call 4", ··· 252 250 BPF_MOV64_IMM(BPF_REG_0, 3), 253 251 BPF_EXIT_INSN(), 254 252 }, 255 - .prog_type = BPF_PROG_TYPE_TRACEPOINT, 256 - .errstr = "back-edge from insn", 257 - .result = REJECT, 253 + .prog_type = BPF_PROG_TYPE_SCHED_CLS, 254 + .result = ACCEPT, 255 + .retval = 1, 258 256 }, 259 257 { 260 258 "calls: conditional call 6", 261 259 .insns = { 260 + BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 261 + BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 262 262 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 263 - BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, -2), 263 + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, -3), 264 264 BPF_EXIT_INSN(), 265 265 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 266 266 offsetof(struct __sk_buff, mark)), 267 267 BPF_EXIT_INSN(), 268 268 }, 269 - .prog_type = BPF_PROG_TYPE_TRACEPOINT, 270 - .errstr = "back-edge from insn", 269 + .prog_type = BPF_PROG_TYPE_SCHED_CLS, 270 + .errstr = "infinite loop detected", 271 271 .result = REJECT, 272 272 }, 273 273 {
+7 -4
tools/testing/selftests/bpf/verifier/cfg.c
··· 41 41 BPF_JMP_IMM(BPF_JA, 0, 0, -1), 42 42 BPF_EXIT_INSN(), 43 43 }, 44 - .errstr = "back-edge", 44 + .errstr = "unreachable insn 1", 45 + .errstr_unpriv = "back-edge", 45 46 .result = REJECT, 46 47 }, 47 48 { ··· 54 53 BPF_JMP_IMM(BPF_JA, 0, 0, -4), 55 54 BPF_EXIT_INSN(), 56 55 }, 57 - .errstr = "back-edge", 56 + .errstr = "unreachable insn 4", 57 + .errstr_unpriv = "back-edge", 58 58 .result = REJECT, 59 59 }, 60 60 { 61 61 "conditional loop", 62 62 .insns = { 63 - BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 63 + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 64 64 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 65 65 BPF_MOV64_REG(BPF_REG_3, BPF_REG_0), 66 66 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -3), 67 67 BPF_EXIT_INSN(), 68 68 }, 69 - .errstr = "back-edge", 69 + .errstr = "infinite loop detected", 70 + .errstr_unpriv = "back-edge", 70 71 .result = REJECT, 71 72 },