|
500 | 500 | .errstr = "map_value pointer and 1000000000000",
|
501 | 501 | .result = REJECT
|
502 | 502 | },
|
| 503 | +{ |
| 504 | + "bounds check mixed 32bit and 64bit arithmatic. test1", |
| 505 | + .insns = { |
| 506 | + BPF_MOV64_IMM(BPF_REG_0, 0), |
| 507 | + BPF_MOV64_IMM(BPF_REG_1, -1), |
| 508 | + BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 32), |
| 509 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), |
| 510 | + /* r1 = 0xffffFFFF00000001 */ |
| 511 | + BPF_JMP32_IMM(BPF_JGT, BPF_REG_1, 1, 3), |
| 512 | + /* check ALU64 op keeps 32bit bounds */ |
| 513 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), |
| 514 | + BPF_JMP32_IMM(BPF_JGT, BPF_REG_1, 2, 1), |
| 515 | + BPF_JMP_A(1), |
| 516 | + /* invalid ldx if bounds are lost above */ |
| 517 | + BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, -1), |
| 518 | + BPF_EXIT_INSN(), |
| 519 | + }, |
| 520 | + .result = ACCEPT |
| 521 | +}, |
| 522 | +{ |
| 523 | + "bounds check mixed 32bit and 64bit arithmatic. test2", |
| 524 | + .insns = { |
| 525 | + BPF_MOV64_IMM(BPF_REG_0, 0), |
| 526 | + BPF_MOV64_IMM(BPF_REG_1, -1), |
| 527 | + BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 32), |
| 528 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), |
| 529 | + /* r1 = 0xffffFFFF00000001 */ |
| 530 | + BPF_MOV64_IMM(BPF_REG_2, 3), |
| 531 | + /* r1 = 0x2 */ |
| 532 | + BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 1), |
| 533 | + /* check ALU32 op zero extends 64bit bounds */ |
| 534 | + BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 1), |
| 535 | + BPF_JMP_A(1), |
| 536 | + /* invalid ldx if bounds are lost above */ |
| 537 | + BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, -1), |
| 538 | + BPF_EXIT_INSN(), |
| 539 | + }, |
| 540 | + .result = ACCEPT |
| 541 | +}, |
0 commit comments