0001 {
0002 "constant register |= constant should keep constant type",
0003 .insns = {
0004 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
0005 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48),
0006 BPF_MOV64_IMM(BPF_REG_2, 34),
0007 BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 13),
0008 BPF_MOV64_IMM(BPF_REG_3, 0),
0009 BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0010 BPF_EXIT_INSN(),
0011 },
0012 .result = ACCEPT,
0013 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0014 },
0015 {
0016 "constant register |= constant should not bypass stack boundary checks",
0017 .insns = {
0018 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
0019 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48),
0020 BPF_MOV64_IMM(BPF_REG_2, 34),
0021 BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 24),
0022 BPF_MOV64_IMM(BPF_REG_3, 0),
0023 BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0024 BPF_EXIT_INSN(),
0025 },
0026 .errstr = "invalid indirect access to stack R1 off=-48 size=58",
0027 .result = REJECT,
0028 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0029 },
0030 {
0031 "constant register |= constant register should keep constant type",
0032 .insns = {
0033 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
0034 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48),
0035 BPF_MOV64_IMM(BPF_REG_2, 34),
0036 BPF_MOV64_IMM(BPF_REG_4, 13),
0037 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_4),
0038 BPF_MOV64_IMM(BPF_REG_3, 0),
0039 BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0040 BPF_EXIT_INSN(),
0041 },
0042 .result = ACCEPT,
0043 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0044 },
0045 {
0046 "constant register |= constant register should not bypass stack boundary checks",
0047 .insns = {
0048 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
0049 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48),
0050 BPF_MOV64_IMM(BPF_REG_2, 34),
0051 BPF_MOV64_IMM(BPF_REG_4, 24),
0052 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_4),
0053 BPF_MOV64_IMM(BPF_REG_3, 0),
0054 BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0055 BPF_EXIT_INSN(),
0056 },
0057 .errstr = "invalid indirect access to stack R1 off=-48 size=58",
0058 .result = REJECT,
0059 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0060 },