Skip to content

Commit b479d38

Browse files
author
Alexei Starovoitov
committed
Merge branch 'bpf-fix-incorrect-immediate-spill'
Hao Sun says: ==================== bpf: Fix incorrect immediate spill Immediate is incorrectly cast to u32 before being spilled, losing sign information. The range information is incorrect after load again. Fix immediate spill by remove the cast. The second patch add a test case for this. Signed-off-by: Hao Sun <sunhao.th@gmail.com> --- Changes in v3: - Change the expected log to fix the test case - Link to v2: https://lore.kernel.org/r/20231101-fix-check-stack-write-v2-0-cb7c17b869b0@gmail.com Changes in v2: - Add fix and cc tags. - Link to v1: https://lore.kernel.org/r/20231026-fix-check-stack-write-v1-0-6b325ef3ce7e@gmail.com --- ==================== Link: https://lore.kernel.org/r/20231101-fix-check-stack-write-v3-0-f05c2b1473d5@gmail.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
2 parents 05670f8 + 85eb035 commit b479d38

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

kernel/bpf/verifier.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4674,7 +4674,7 @@ static int check_stack_write_fixed_off(struct bpf_verifier_env *env,
46744674
insn->imm != 0 && env->bpf_capable) {
46754675
struct bpf_reg_state fake_reg = {};
46764676

4677-
__mark_reg_known(&fake_reg, (u32)insn->imm);
4677+
__mark_reg_known(&fake_reg, insn->imm);
46784678
fake_reg.type = SCALAR_VALUE;
46794679
save_register_state(state, spi, &fake_reg, size);
46804680
} else if (reg && is_spillable_regtype(reg->type)) {

tools/testing/selftests/bpf/verifier/bpf_st_mem.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,35 @@
6565
.expected_attach_type = BPF_SK_LOOKUP,
6666
.runs = -1,
6767
},
68+
{
69+
"BPF_ST_MEM stack imm sign",
70+
/* Check if verifier correctly reasons about sign of an
71+
* immediate spilled to stack by BPF_ST instruction.
72+
*
73+
* fp[-8] = -44;
74+
* r0 = fp[-8];
75+
* if r0 s< 0 goto ret0;
76+
* r0 = -1;
77+
* exit;
78+
* ret0:
79+
* r0 = 0;
80+
* exit;
81+
*/
82+
.insns = {
83+
BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, -44),
84+
BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
85+
BPF_JMP_IMM(BPF_JSLT, BPF_REG_0, 0, 2),
86+
BPF_MOV64_IMM(BPF_REG_0, -1),
87+
BPF_EXIT_INSN(),
88+
BPF_MOV64_IMM(BPF_REG_0, 0),
89+
BPF_EXIT_INSN(),
90+
},
91+
/* Use prog type that requires return value in range [0, 1] */
92+
.prog_type = BPF_PROG_TYPE_SK_LOOKUP,
93+
.expected_attach_type = BPF_SK_LOOKUP,
94+
.result = VERBOSE_ACCEPT,
95+
.runs = -1,
96+
.errstr = "0: (7a) *(u64 *)(r10 -8) = -44 ; R10=fp0 fp-8_w=-44\
97+
2: (c5) if r0 s< 0x0 goto pc+2\
98+
R0_w=-44",
99+
},

0 commit comments

Comments
 (0)