mirror of
https://github.com/torvalds/linux.git
synced 2026-09-12 12:34:02 +02:00
bpf: mark a NULL call argument precise
check_func_arg() allows bpf_register_is_null() for nullable arguments
w/o marking the underlying scalar register precise. Hence a checkpoint
created on such a path would prune against arbitrary scalar value.
check_helper_call() enforces second parameter of the
bpf_get_local_storage() to be zero, w/o marking the underlying scalar
register precise. Hence a checkpoint created on such a path would
prune against arbitrary scalar value.
Grouping these two into one patch, as they share the same fixes tag.
Fixes: b5dc0163d8 ("bpf: precise scalar_value tracking")
Signed-off-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/r/20260904-register-is-null-precise-fixes-v1-1-0f5a360ff15d@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
519f858317
commit
1a3a10b030
|
|
@ -8759,11 +8759,15 @@ static int check_func_arg(struct bpf_verifier_env *env, u32 arg,
|
|||
return err;
|
||||
}
|
||||
|
||||
if (bpf_register_is_null(reg) && type_may_be_null(arg_type))
|
||||
if (bpf_register_is_null(reg) && type_may_be_null(arg_type)) {
|
||||
/* A NULL register has a SCALAR_VALUE type, so skip
|
||||
* type checking.
|
||||
*/
|
||||
err = mark_chain_precision(env, regno);
|
||||
if (err)
|
||||
return err;
|
||||
goto skip_type_check;
|
||||
}
|
||||
|
||||
/* arg_btf_id and arg_size are in a union. */
|
||||
if (base_type(arg_type) == ARG_PTR_TO_BTF_ID ||
|
||||
|
|
@ -10923,6 +10927,9 @@ static int check_helper_call(struct bpf_verifier_env *env, struct bpf_insn *insn
|
|||
verbose(env, "get_local_storage() doesn't support non-zero flags\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
err = mark_chain_precision(env, BPF_REG_2);
|
||||
if (err)
|
||||
return err;
|
||||
break;
|
||||
case BPF_FUNC_for_each_map_elem:
|
||||
err = push_callback_call(env, insn, insn_idx, meta.subprogno,
|
||||
|
|
|
|||
|
|
@ -287,9 +287,9 @@ __msg("17: (b7) r0 = 0")
|
|||
__msg("18: (95) exit")
|
||||
__msg("returning from callee:")
|
||||
__msg("to caller at 9:")
|
||||
__msg("frame 0: propagating r1,r4")
|
||||
__msg("frame 0: propagating r1,r3,r4")
|
||||
__msg("mark_precise: frame0: last_idx 9 first_idx 9 subseq_idx -1")
|
||||
__msg("mark_precise: frame0: regs=r1,r4 stack= before 18: (95) exit")
|
||||
__msg("mark_precise: frame0: regs=r1,r3,r4 stack= before 18: (95) exit")
|
||||
__msg("from 18 to 9: safe")
|
||||
__naked int callback_result_precise(void)
|
||||
{
|
||||
|
|
@ -419,9 +419,9 @@ __msg("to caller at 9:")
|
|||
/* r1, r4 are always precise for bpf_loop(),
|
||||
* r6 was marked before backtracking to callback body.
|
||||
*/
|
||||
__msg("frame 0: propagating r1,r4,r6")
|
||||
__msg("frame 0: propagating r1,r3,r4,r6")
|
||||
__msg("mark_precise: frame0: last_idx 9 first_idx 9 subseq_idx -1")
|
||||
__msg("mark_precise: frame0: regs=r1,r4,r6 stack= before 16: (95) exit")
|
||||
__msg("mark_precise: frame0: regs=r1,r3,r4,r6 stack= before 16: (95) exit")
|
||||
__msg("mark_precise: frame1: regs= stack= before 15: (b7) r0 = 0")
|
||||
__msg("mark_precise: frame1: regs= stack= before 9: (85) call bpf_loop")
|
||||
__msg("mark_precise: frame0: parent state regs= stack=:")
|
||||
|
|
@ -575,9 +575,9 @@ __msg("to caller at 10:")
|
|||
/* r1, r4 are always precise for bpf_loop(),
|
||||
* fp-8 was marked before backtracking to callback body.
|
||||
*/
|
||||
__msg("frame 0: propagating r1,r4,fp-8")
|
||||
__msg("frame 0: propagating r1,r3,r4,fp-8")
|
||||
__msg("mark_precise: frame0: last_idx 10 first_idx 10 subseq_idx -1")
|
||||
__msg("mark_precise: frame0: regs=r1,r4 stack=-8 before 18: (95) exit")
|
||||
__msg("mark_precise: frame0: regs=r1,r3,r4 stack=-8 before 18: (95) exit")
|
||||
__msg("mark_precise: frame1: regs= stack= before 17: (b7) r0 = 0")
|
||||
__msg("mark_precise: frame1: regs= stack= before 10: (85) call bpf_loop#181")
|
||||
__msg("mark_precise: frame0: parent state regs= stack=:")
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user