Back to home page

OSCL-LXR

 
 

    


0001 {
0002     "helper access to map: full range",
0003     .insns = {
0004     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0005     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0006     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0007     BPF_LD_MAP_FD(BPF_REG_1, 0),
0008     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0009     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
0010     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0011     BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)),
0012     BPF_MOV64_IMM(BPF_REG_3, 0),
0013     BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0014     BPF_EXIT_INSN(),
0015     },
0016     .fixup_map_hash_48b = { 3 },
0017     .result = ACCEPT,
0018     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0019 },
0020 {
0021     "helper access to map: partial range",
0022     .insns = {
0023     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0024     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0025     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0026     BPF_LD_MAP_FD(BPF_REG_1, 0),
0027     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0028     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
0029     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0030     BPF_MOV64_IMM(BPF_REG_2, 8),
0031     BPF_MOV64_IMM(BPF_REG_3, 0),
0032     BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0033     BPF_EXIT_INSN(),
0034     },
0035     .fixup_map_hash_48b = { 3 },
0036     .result = ACCEPT,
0037     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0038 },
0039 {
0040     "helper access to map: empty range",
0041     .insns = {
0042     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0043     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0044     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0045     BPF_LD_MAP_FD(BPF_REG_1, 0),
0046     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0047     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
0048     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0049     BPF_MOV64_IMM(BPF_REG_2, 0),
0050     BPF_EMIT_CALL(BPF_FUNC_trace_printk),
0051     BPF_EXIT_INSN(),
0052     },
0053     .fixup_map_hash_48b = { 3 },
0054     .errstr = "invalid access to map value, value_size=48 off=0 size=0",
0055     .result = REJECT,
0056     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0057 },
0058 {
0059     "helper access to map: out-of-bound range",
0060     .insns = {
0061     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0062     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0063     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0064     BPF_LD_MAP_FD(BPF_REG_1, 0),
0065     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0066     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
0067     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0068     BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val) + 8),
0069     BPF_MOV64_IMM(BPF_REG_3, 0),
0070     BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0071     BPF_EXIT_INSN(),
0072     },
0073     .fixup_map_hash_48b = { 3 },
0074     .errstr = "invalid access to map value, value_size=48 off=0 size=56",
0075     .result = REJECT,
0076     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0077 },
0078 {
0079     "helper access to map: negative range",
0080     .insns = {
0081     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0082     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0083     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0084     BPF_LD_MAP_FD(BPF_REG_1, 0),
0085     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0086     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
0087     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0088     BPF_MOV64_IMM(BPF_REG_2, -8),
0089     BPF_MOV64_IMM(BPF_REG_3, 0),
0090     BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0091     BPF_EXIT_INSN(),
0092     },
0093     .fixup_map_hash_48b = { 3 },
0094     .errstr = "R2 min value is negative",
0095     .result = REJECT,
0096     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0097 },
0098 {
0099     "helper access to adjusted map (via const imm): full range",
0100     .insns = {
0101     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0102     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0103     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0104     BPF_LD_MAP_FD(BPF_REG_1, 0),
0105     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0106     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
0107     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0108     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, offsetof(struct test_val, foo)),
0109     BPF_MOV64_IMM(BPF_REG_2,
0110               sizeof(struct test_val) - offsetof(struct test_val, foo)),
0111     BPF_MOV64_IMM(BPF_REG_3, 0),
0112     BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0113     BPF_EXIT_INSN(),
0114     },
0115     .fixup_map_hash_48b = { 3 },
0116     .result = ACCEPT,
0117     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0118 },
0119 {
0120     "helper access to adjusted map (via const imm): partial range",
0121     .insns = {
0122     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0123     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0124     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0125     BPF_LD_MAP_FD(BPF_REG_1, 0),
0126     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0127     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
0128     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0129     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, offsetof(struct test_val, foo)),
0130     BPF_MOV64_IMM(BPF_REG_2, 8),
0131     BPF_MOV64_IMM(BPF_REG_3, 0),
0132     BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0133     BPF_EXIT_INSN(),
0134     },
0135     .fixup_map_hash_48b = { 3 },
0136     .result = ACCEPT,
0137     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0138 },
0139 {
0140     "helper access to adjusted map (via const imm): empty range",
0141     .insns = {
0142     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0143     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0144     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0145     BPF_LD_MAP_FD(BPF_REG_1, 0),
0146     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0147     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
0148     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0149     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, offsetof(struct test_val, foo)),
0150     BPF_MOV64_IMM(BPF_REG_2, 0),
0151     BPF_EMIT_CALL(BPF_FUNC_trace_printk),
0152     BPF_EXIT_INSN(),
0153     },
0154     .fixup_map_hash_48b = { 3 },
0155     .errstr = "invalid access to map value, value_size=48 off=4 size=0",
0156     .result = REJECT,
0157     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0158 },
0159 {
0160     "helper access to adjusted map (via const imm): out-of-bound range",
0161     .insns = {
0162     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0163     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0164     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0165     BPF_LD_MAP_FD(BPF_REG_1, 0),
0166     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0167     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
0168     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0169     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, offsetof(struct test_val, foo)),
0170     BPF_MOV64_IMM(BPF_REG_2,
0171               sizeof(struct test_val) - offsetof(struct test_val, foo) + 8),
0172     BPF_MOV64_IMM(BPF_REG_3, 0),
0173     BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0174     BPF_EXIT_INSN(),
0175     },
0176     .fixup_map_hash_48b = { 3 },
0177     .errstr = "invalid access to map value, value_size=48 off=4 size=52",
0178     .result = REJECT,
0179     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0180 },
0181 {
0182     "helper access to adjusted map (via const imm): negative range (> adjustment)",
0183     .insns = {
0184     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0185     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0186     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0187     BPF_LD_MAP_FD(BPF_REG_1, 0),
0188     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0189     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
0190     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0191     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, offsetof(struct test_val, foo)),
0192     BPF_MOV64_IMM(BPF_REG_2, -8),
0193     BPF_MOV64_IMM(BPF_REG_3, 0),
0194     BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0195     BPF_EXIT_INSN(),
0196     },
0197     .fixup_map_hash_48b = { 3 },
0198     .errstr = "R2 min value is negative",
0199     .result = REJECT,
0200     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0201 },
0202 {
0203     "helper access to adjusted map (via const imm): negative range (< adjustment)",
0204     .insns = {
0205     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0206     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0207     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0208     BPF_LD_MAP_FD(BPF_REG_1, 0),
0209     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0210     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
0211     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0212     BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, offsetof(struct test_val, foo)),
0213     BPF_MOV64_IMM(BPF_REG_2, -1),
0214     BPF_MOV64_IMM(BPF_REG_3, 0),
0215     BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0216     BPF_EXIT_INSN(),
0217     },
0218     .fixup_map_hash_48b = { 3 },
0219     .errstr = "R2 min value is negative",
0220     .result = REJECT,
0221     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0222 },
0223 {
0224     "helper access to adjusted map (via const reg): full range",
0225     .insns = {
0226     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0227     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0228     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0229     BPF_LD_MAP_FD(BPF_REG_1, 0),
0230     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0231     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
0232     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0233     BPF_MOV64_IMM(BPF_REG_3, offsetof(struct test_val, foo)),
0234     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0235     BPF_MOV64_IMM(BPF_REG_2,
0236               sizeof(struct test_val) - offsetof(struct test_val, foo)),
0237     BPF_MOV64_IMM(BPF_REG_3, 0),
0238     BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0239     BPF_EXIT_INSN(),
0240     },
0241     .fixup_map_hash_48b = { 3 },
0242     .result = ACCEPT,
0243     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0244 },
0245 {
0246     "helper access to adjusted map (via const reg): partial range",
0247     .insns = {
0248     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0249     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0250     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0251     BPF_LD_MAP_FD(BPF_REG_1, 0),
0252     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0253     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
0254     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0255     BPF_MOV64_IMM(BPF_REG_3, offsetof(struct test_val, foo)),
0256     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0257     BPF_MOV64_IMM(BPF_REG_2, 8),
0258     BPF_MOV64_IMM(BPF_REG_3, 0),
0259     BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0260     BPF_EXIT_INSN(),
0261     },
0262     .fixup_map_hash_48b = { 3 },
0263     .result = ACCEPT,
0264     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0265 },
0266 {
0267     "helper access to adjusted map (via const reg): empty range",
0268     .insns = {
0269     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0270     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0271     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0272     BPF_LD_MAP_FD(BPF_REG_1, 0),
0273     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0274     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
0275     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0276     BPF_MOV64_IMM(BPF_REG_3, 0),
0277     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0278     BPF_MOV64_IMM(BPF_REG_2, 0),
0279     BPF_EMIT_CALL(BPF_FUNC_trace_printk),
0280     BPF_EXIT_INSN(),
0281     },
0282     .fixup_map_hash_48b = { 3 },
0283     .errstr = "R1 min value is outside of the allowed memory range",
0284     .result = REJECT,
0285     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0286 },
0287 {
0288     "helper access to adjusted map (via const reg): out-of-bound range",
0289     .insns = {
0290     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0291     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0292     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0293     BPF_LD_MAP_FD(BPF_REG_1, 0),
0294     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0295     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
0296     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0297     BPF_MOV64_IMM(BPF_REG_3, offsetof(struct test_val, foo)),
0298     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0299     BPF_MOV64_IMM(BPF_REG_2,
0300               sizeof(struct test_val) -
0301               offsetof(struct test_val, foo) + 8),
0302     BPF_MOV64_IMM(BPF_REG_3, 0),
0303     BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0304     BPF_EXIT_INSN(),
0305     },
0306     .fixup_map_hash_48b = { 3 },
0307     .errstr = "invalid access to map value, value_size=48 off=4 size=52",
0308     .result = REJECT,
0309     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0310 },
0311 {
0312     "helper access to adjusted map (via const reg): negative range (> adjustment)",
0313     .insns = {
0314     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0315     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0316     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0317     BPF_LD_MAP_FD(BPF_REG_1, 0),
0318     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0319     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
0320     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0321     BPF_MOV64_IMM(BPF_REG_3, offsetof(struct test_val, foo)),
0322     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0323     BPF_MOV64_IMM(BPF_REG_2, -8),
0324     BPF_MOV64_IMM(BPF_REG_3, 0),
0325     BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0326     BPF_EXIT_INSN(),
0327     },
0328     .fixup_map_hash_48b = { 3 },
0329     .errstr = "R2 min value is negative",
0330     .result = REJECT,
0331     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0332 },
0333 {
0334     "helper access to adjusted map (via const reg): negative range (< adjustment)",
0335     .insns = {
0336     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0337     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0338     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0339     BPF_LD_MAP_FD(BPF_REG_1, 0),
0340     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0341     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
0342     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0343     BPF_MOV64_IMM(BPF_REG_3, offsetof(struct test_val, foo)),
0344     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0345     BPF_MOV64_IMM(BPF_REG_2, -1),
0346     BPF_MOV64_IMM(BPF_REG_3, 0),
0347     BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0348     BPF_EXIT_INSN(),
0349     },
0350     .fixup_map_hash_48b = { 3 },
0351     .errstr = "R2 min value is negative",
0352     .result = REJECT,
0353     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0354 },
0355 {
0356     "helper access to adjusted map (via variable): full range",
0357     .insns = {
0358     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0359     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0360     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0361     BPF_LD_MAP_FD(BPF_REG_1, 0),
0362     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0363     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
0364     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0365     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
0366     BPF_JMP_IMM(BPF_JGT, BPF_REG_3, offsetof(struct test_val, foo), 4),
0367     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0368     BPF_MOV64_IMM(BPF_REG_2,
0369               sizeof(struct test_val) - offsetof(struct test_val, foo)),
0370     BPF_MOV64_IMM(BPF_REG_3, 0),
0371     BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0372     BPF_EXIT_INSN(),
0373     },
0374     .fixup_map_hash_48b = { 3 },
0375     .result = ACCEPT,
0376     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0377 },
0378 {
0379     "helper access to adjusted map (via variable): partial range",
0380     .insns = {
0381     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0382     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0383     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0384     BPF_LD_MAP_FD(BPF_REG_1, 0),
0385     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0386     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
0387     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0388     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
0389     BPF_JMP_IMM(BPF_JGT, BPF_REG_3, offsetof(struct test_val, foo), 4),
0390     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0391     BPF_MOV64_IMM(BPF_REG_2, 8),
0392     BPF_MOV64_IMM(BPF_REG_3, 0),
0393     BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0394     BPF_EXIT_INSN(),
0395     },
0396     .fixup_map_hash_48b = { 3 },
0397     .result = ACCEPT,
0398     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0399 },
0400 {
0401     "helper access to adjusted map (via variable): empty range",
0402     .insns = {
0403     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0404     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0405     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0406     BPF_LD_MAP_FD(BPF_REG_1, 0),
0407     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0408     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
0409     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0410     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
0411     BPF_JMP_IMM(BPF_JGT, BPF_REG_3, offsetof(struct test_val, foo), 3),
0412     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0413     BPF_MOV64_IMM(BPF_REG_2, 0),
0414     BPF_EMIT_CALL(BPF_FUNC_trace_printk),
0415     BPF_EXIT_INSN(),
0416     },
0417     .fixup_map_hash_48b = { 3 },
0418     .errstr = "R1 min value is outside of the allowed memory range",
0419     .result = REJECT,
0420     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0421 },
0422 {
0423     "helper access to adjusted map (via variable): no max check",
0424     .insns = {
0425     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0426     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0427     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0428     BPF_LD_MAP_FD(BPF_REG_1, 0),
0429     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0430     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
0431     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0432     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
0433     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0434     BPF_MOV64_IMM(BPF_REG_2, 1),
0435     BPF_MOV64_IMM(BPF_REG_3, 0),
0436     BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0437     BPF_EXIT_INSN(),
0438     },
0439     .fixup_map_hash_48b = { 3 },
0440     .errstr = "R1 unbounded memory access",
0441     .result = REJECT,
0442     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0443 },
0444 {
0445     "helper access to adjusted map (via variable): wrong max check",
0446     .insns = {
0447     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0448     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0449     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0450     BPF_LD_MAP_FD(BPF_REG_1, 0),
0451     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0452     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
0453     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0454     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
0455     BPF_JMP_IMM(BPF_JGT, BPF_REG_3, offsetof(struct test_val, foo), 4),
0456     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0457     BPF_MOV64_IMM(BPF_REG_2,
0458               sizeof(struct test_val) -
0459               offsetof(struct test_val, foo) + 1),
0460     BPF_MOV64_IMM(BPF_REG_3, 0),
0461     BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
0462     BPF_EXIT_INSN(),
0463     },
0464     .fixup_map_hash_48b = { 3 },
0465     .errstr = "invalid access to map value, value_size=48 off=4 size=45",
0466     .result = REJECT,
0467     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0468 },
0469 {
0470     "helper access to map: bounds check using <, good access",
0471     .insns = {
0472     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0473     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0474     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0475     BPF_LD_MAP_FD(BPF_REG_1, 0),
0476     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0477     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
0478     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0479     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
0480     BPF_JMP_IMM(BPF_JLT, BPF_REG_3, 32, 2),
0481     BPF_MOV64_IMM(BPF_REG_0, 0),
0482     BPF_EXIT_INSN(),
0483     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0484     BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
0485     BPF_MOV64_IMM(BPF_REG_0, 0),
0486     BPF_EXIT_INSN(),
0487     },
0488     .fixup_map_hash_48b = { 3 },
0489     .result = ACCEPT,
0490     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0491 },
0492 {
0493     "helper access to map: bounds check using <, bad access",
0494     .insns = {
0495     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0496     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0497     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0498     BPF_LD_MAP_FD(BPF_REG_1, 0),
0499     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0500     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
0501     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0502     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
0503     BPF_JMP_IMM(BPF_JLT, BPF_REG_3, 32, 4),
0504     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0505     BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
0506     BPF_MOV64_IMM(BPF_REG_0, 0),
0507     BPF_EXIT_INSN(),
0508     BPF_MOV64_IMM(BPF_REG_0, 0),
0509     BPF_EXIT_INSN(),
0510     },
0511     .fixup_map_hash_48b = { 3 },
0512     .result = REJECT,
0513     .errstr = "R1 unbounded memory access",
0514     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0515 },
0516 {
0517     "helper access to map: bounds check using <=, good access",
0518     .insns = {
0519     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0520     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0521     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0522     BPF_LD_MAP_FD(BPF_REG_1, 0),
0523     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0524     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
0525     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0526     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
0527     BPF_JMP_IMM(BPF_JLE, BPF_REG_3, 32, 2),
0528     BPF_MOV64_IMM(BPF_REG_0, 0),
0529     BPF_EXIT_INSN(),
0530     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0531     BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
0532     BPF_MOV64_IMM(BPF_REG_0, 0),
0533     BPF_EXIT_INSN(),
0534     },
0535     .fixup_map_hash_48b = { 3 },
0536     .result = ACCEPT,
0537     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0538 },
0539 {
0540     "helper access to map: bounds check using <=, bad access",
0541     .insns = {
0542     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0543     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0544     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0545     BPF_LD_MAP_FD(BPF_REG_1, 0),
0546     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0547     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
0548     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0549     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
0550     BPF_JMP_IMM(BPF_JLE, BPF_REG_3, 32, 4),
0551     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0552     BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
0553     BPF_MOV64_IMM(BPF_REG_0, 0),
0554     BPF_EXIT_INSN(),
0555     BPF_MOV64_IMM(BPF_REG_0, 0),
0556     BPF_EXIT_INSN(),
0557     },
0558     .fixup_map_hash_48b = { 3 },
0559     .result = REJECT,
0560     .errstr = "R1 unbounded memory access",
0561     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0562 },
0563 {
0564     "helper access to map: bounds check using s<, good access",
0565     .insns = {
0566     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0567     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0568     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0569     BPF_LD_MAP_FD(BPF_REG_1, 0),
0570     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0571     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
0572     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0573     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
0574     BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2),
0575     BPF_MOV64_IMM(BPF_REG_0, 0),
0576     BPF_EXIT_INSN(),
0577     BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 0, -3),
0578     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0579     BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
0580     BPF_MOV64_IMM(BPF_REG_0, 0),
0581     BPF_EXIT_INSN(),
0582     },
0583     .fixup_map_hash_48b = { 3 },
0584     .result = ACCEPT,
0585     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0586 },
0587 {
0588     "helper access to map: bounds check using s<, good access 2",
0589     .insns = {
0590     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0591     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0592     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0593     BPF_LD_MAP_FD(BPF_REG_1, 0),
0594     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0595     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
0596     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0597     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
0598     BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2),
0599     BPF_MOV64_IMM(BPF_REG_0, 0),
0600     BPF_EXIT_INSN(),
0601     BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, -3, -3),
0602     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0603     BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
0604     BPF_MOV64_IMM(BPF_REG_0, 0),
0605     BPF_EXIT_INSN(),
0606     },
0607     .fixup_map_hash_48b = { 3 },
0608     .result = ACCEPT,
0609     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0610 },
0611 {
0612     "helper access to map: bounds check using s<, bad access",
0613     .insns = {
0614     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0615     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0616     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0617     BPF_LD_MAP_FD(BPF_REG_1, 0),
0618     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0619     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
0620     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0621     BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0),
0622     BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2),
0623     BPF_MOV64_IMM(BPF_REG_0, 0),
0624     BPF_EXIT_INSN(),
0625     BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, -3, -3),
0626     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0627     BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
0628     BPF_MOV64_IMM(BPF_REG_0, 0),
0629     BPF_EXIT_INSN(),
0630     },
0631     .fixup_map_hash_48b = { 3 },
0632     .result = REJECT,
0633     .errstr = "R1 min value is negative",
0634     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0635 },
0636 {
0637     "helper access to map: bounds check using s<=, good access",
0638     .insns = {
0639     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0640     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0641     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0642     BPF_LD_MAP_FD(BPF_REG_1, 0),
0643     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0644     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
0645     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0646     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
0647     BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2),
0648     BPF_MOV64_IMM(BPF_REG_0, 0),
0649     BPF_EXIT_INSN(),
0650     BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 0, -3),
0651     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0652     BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
0653     BPF_MOV64_IMM(BPF_REG_0, 0),
0654     BPF_EXIT_INSN(),
0655     },
0656     .fixup_map_hash_48b = { 3 },
0657     .result = ACCEPT,
0658     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0659 },
0660 {
0661     "helper access to map: bounds check using s<=, good access 2",
0662     .insns = {
0663     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0664     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0665     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0666     BPF_LD_MAP_FD(BPF_REG_1, 0),
0667     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0668     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
0669     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0670     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
0671     BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2),
0672     BPF_MOV64_IMM(BPF_REG_0, 0),
0673     BPF_EXIT_INSN(),
0674     BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, -3, -3),
0675     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0676     BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
0677     BPF_MOV64_IMM(BPF_REG_0, 0),
0678     BPF_EXIT_INSN(),
0679     },
0680     .fixup_map_hash_48b = { 3 },
0681     .result = ACCEPT,
0682     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0683 },
0684 {
0685     "helper access to map: bounds check using s<=, bad access",
0686     .insns = {
0687     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0688     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0689     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0690     BPF_LD_MAP_FD(BPF_REG_1, 0),
0691     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0692     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
0693     BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0694     BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0),
0695     BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2),
0696     BPF_MOV64_IMM(BPF_REG_0, 0),
0697     BPF_EXIT_INSN(),
0698     BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, -3, -3),
0699     BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
0700     BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0),
0701     BPF_MOV64_IMM(BPF_REG_0, 0),
0702     BPF_EXIT_INSN(),
0703     },
0704     .fixup_map_hash_48b = { 3 },
0705     .result = REJECT,
0706     .errstr = "R1 min value is negative",
0707     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0708 },
0709 {
0710     "map lookup helper access to map",
0711     .insns = {
0712     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0713     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0714     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0715     BPF_LD_MAP_FD(BPF_REG_1, 0),
0716     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0717     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
0718     BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0719     BPF_LD_MAP_FD(BPF_REG_1, 0),
0720     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0721     BPF_EXIT_INSN(),
0722     },
0723     .fixup_map_hash_16b = { 3, 8 },
0724     .result = ACCEPT,
0725     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0726 },
0727 {
0728     "map update helper access to map",
0729     .insns = {
0730     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0731     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0732     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0733     BPF_LD_MAP_FD(BPF_REG_1, 0),
0734     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0735     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
0736     BPF_MOV64_IMM(BPF_REG_4, 0),
0737     BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
0738     BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0739     BPF_LD_MAP_FD(BPF_REG_1, 0),
0740     BPF_EMIT_CALL(BPF_FUNC_map_update_elem),
0741     BPF_EXIT_INSN(),
0742     },
0743     .fixup_map_hash_16b = { 3, 10 },
0744     .result = ACCEPT,
0745     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0746 },
0747 {
0748     "map update helper access to map: wrong size",
0749     .insns = {
0750     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0751     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0752     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0753     BPF_LD_MAP_FD(BPF_REG_1, 0),
0754     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0755     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
0756     BPF_MOV64_IMM(BPF_REG_4, 0),
0757     BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
0758     BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0759     BPF_LD_MAP_FD(BPF_REG_1, 0),
0760     BPF_EMIT_CALL(BPF_FUNC_map_update_elem),
0761     BPF_EXIT_INSN(),
0762     },
0763     .fixup_map_hash_8b = { 3 },
0764     .fixup_map_hash_16b = { 10 },
0765     .result = REJECT,
0766     .errstr = "invalid access to map value, value_size=8 off=0 size=16",
0767     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0768 },
0769 {
0770     "map helper access to adjusted map (via const imm)",
0771     .insns = {
0772     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0773     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0774     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0775     BPF_LD_MAP_FD(BPF_REG_1, 0),
0776     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0777     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
0778     BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0779     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, offsetof(struct other_val, bar)),
0780     BPF_LD_MAP_FD(BPF_REG_1, 0),
0781     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0782     BPF_EXIT_INSN(),
0783     },
0784     .fixup_map_hash_16b = { 3, 9 },
0785     .result = ACCEPT,
0786     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0787 },
0788 {
0789     "map helper access to adjusted map (via const imm): out-of-bound 1",
0790     .insns = {
0791     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0792     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0793     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0794     BPF_LD_MAP_FD(BPF_REG_1, 0),
0795     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0796     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
0797     BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0798     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, sizeof(struct other_val) - 4),
0799     BPF_LD_MAP_FD(BPF_REG_1, 0),
0800     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0801     BPF_EXIT_INSN(),
0802     },
0803     .fixup_map_hash_16b = { 3, 9 },
0804     .result = REJECT,
0805     .errstr = "invalid access to map value, value_size=16 off=12 size=8",
0806     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0807 },
0808 {
0809     "map helper access to adjusted map (via const imm): out-of-bound 2",
0810     .insns = {
0811     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0812     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0813     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0814     BPF_LD_MAP_FD(BPF_REG_1, 0),
0815     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0816     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
0817     BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0818     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
0819     BPF_LD_MAP_FD(BPF_REG_1, 0),
0820     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0821     BPF_EXIT_INSN(),
0822     },
0823     .fixup_map_hash_16b = { 3, 9 },
0824     .result = REJECT,
0825     .errstr = "invalid access to map value, value_size=16 off=-4 size=8",
0826     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0827 },
0828 {
0829     "map helper access to adjusted map (via const reg)",
0830     .insns = {
0831     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0832     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0833     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0834     BPF_LD_MAP_FD(BPF_REG_1, 0),
0835     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0836     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
0837     BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0838     BPF_MOV64_IMM(BPF_REG_3, offsetof(struct other_val, bar)),
0839     BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
0840     BPF_LD_MAP_FD(BPF_REG_1, 0),
0841     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0842     BPF_EXIT_INSN(),
0843     },
0844     .fixup_map_hash_16b = { 3, 10 },
0845     .result = ACCEPT,
0846     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0847 },
0848 {
0849     "map helper access to adjusted map (via const reg): out-of-bound 1",
0850     .insns = {
0851     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0852     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0853     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0854     BPF_LD_MAP_FD(BPF_REG_1, 0),
0855     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0856     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
0857     BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0858     BPF_MOV64_IMM(BPF_REG_3, sizeof(struct other_val) - 4),
0859     BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
0860     BPF_LD_MAP_FD(BPF_REG_1, 0),
0861     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0862     BPF_EXIT_INSN(),
0863     },
0864     .fixup_map_hash_16b = { 3, 10 },
0865     .result = REJECT,
0866     .errstr = "invalid access to map value, value_size=16 off=12 size=8",
0867     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0868 },
0869 {
0870     "map helper access to adjusted map (via const reg): out-of-bound 2",
0871     .insns = {
0872     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0873     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0874     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0875     BPF_LD_MAP_FD(BPF_REG_1, 0),
0876     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0877     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
0878     BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0879     BPF_MOV64_IMM(BPF_REG_3, -4),
0880     BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
0881     BPF_LD_MAP_FD(BPF_REG_1, 0),
0882     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0883     BPF_EXIT_INSN(),
0884     },
0885     .fixup_map_hash_16b = { 3, 10 },
0886     .result = REJECT,
0887     .errstr = "invalid access to map value, value_size=16 off=-4 size=8",
0888     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0889 },
0890 {
0891     "map helper access to adjusted map (via variable)",
0892     .insns = {
0893     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0894     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0895     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0896     BPF_LD_MAP_FD(BPF_REG_1, 0),
0897     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0898     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
0899     BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0900     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
0901     BPF_JMP_IMM(BPF_JGT, BPF_REG_3, offsetof(struct other_val, bar), 4),
0902     BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
0903     BPF_LD_MAP_FD(BPF_REG_1, 0),
0904     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0905     BPF_EXIT_INSN(),
0906     },
0907     .fixup_map_hash_16b = { 3, 11 },
0908     .result = ACCEPT,
0909     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0910 },
0911 {
0912     "map helper access to adjusted map (via variable): no max check",
0913     .insns = {
0914     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0915     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0916     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0917     BPF_LD_MAP_FD(BPF_REG_1, 0),
0918     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0919     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
0920     BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0921     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
0922     BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
0923     BPF_LD_MAP_FD(BPF_REG_1, 0),
0924     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0925     BPF_EXIT_INSN(),
0926     },
0927     .fixup_map_hash_16b = { 3, 10 },
0928     .result = REJECT,
0929     .errstr = "R2 unbounded memory access, make sure to bounds check any such access",
0930     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0931 },
0932 {
0933     "map helper access to adjusted map (via variable): wrong max check",
0934     .insns = {
0935     BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
0936     BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
0937     BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
0938     BPF_LD_MAP_FD(BPF_REG_1, 0),
0939     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0940     BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
0941     BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
0942     BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0),
0943     BPF_JMP_IMM(BPF_JGT, BPF_REG_3, offsetof(struct other_val, bar) + 1, 4),
0944     BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3),
0945     BPF_LD_MAP_FD(BPF_REG_1, 0),
0946     BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
0947     BPF_EXIT_INSN(),
0948     },
0949     .fixup_map_hash_16b = { 3, 11 },
0950     .result = REJECT,
0951     .errstr = "invalid access to map value, value_size=16 off=9 size=8",
0952     .prog_type = BPF_PROG_TYPE_TRACEPOINT,
0953 },