Skip to content

Commit 1b0c7ef

Browse files
laoarKernel Patches Daemon
authored andcommitted
bpf: Reject attaching fexit to functions annotated with __noreturn
If we attach fexit to a function annotated with __noreturn, it will cause an issue that the bpf trampoline image will be left over even if the bpf link has been destroyed. Take attaching do_exit() for example. The fexit works as follows, bpf_trampoline + __bpf_tramp_enter + percpu_ref_get(&tr->pcref); + call do_exit() + __bpf_tramp_exit + percpu_ref_put(&tr->pcref); Since do_exit() never returns, the refcnt of the trampoline image is never decremented, preventing it from being freed. This can be verified with as follows, $ bpftool link show <<<< nothing output $ grep "bpf_trampoline_[0-9]" /proc/kallsyms ffffffffc04cb000 t bpf_trampoline_6442526459 [bpf] <<<< leftover With this change, attaching fexit probes to functions like do_exit() will be rejected. $ ./fexit libbpf: prog 'fexit': BPF program load failed: -EINVAL libbpf: prog 'fexit': -- BEGIN PROG LOAD LOG -- processed 0 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0 -- END PROG LOAD LOG -- libbpf: prog 'fexit': failed to load: -EINVAL libbpf: failed to load object 'fexit_bpf' libbpf: failed to load BPF skeleton 'fexit_bpf': -EINVAL failed to load BPF object -22 Signed-off-by: Yafang Shao <[email protected]>
1 parent 71dca3c commit 1b0c7ef

File tree

1 file changed

+10
-0
lines changed

1 file changed

+10
-0
lines changed

kernel/bpf/verifier.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22869,6 +22869,13 @@ BTF_ID(func, __rcu_read_unlock)
2286922869
#endif
2287022870
BTF_SET_END(btf_id_deny)
2287122871

22872+
/* The functions annotated with __noreturn are denied. */
22873+
BTF_SET_START(fexit_deny)
22874+
#define NORETURN(fn) BTF_ID(func, fn)
22875+
#include <linux/noreturns.h>
22876+
#undef NORETURN
22877+
BTF_SET_END(fexit_deny)
22878+
2287222879
static bool can_be_sleepable(struct bpf_prog *prog)
2287322880
{
2287422881
if (prog->type == BPF_PROG_TYPE_TRACING) {
@@ -22957,6 +22964,9 @@ static int check_attach_btf_id(struct bpf_verifier_env *env)
2295722964
} else if (prog->type == BPF_PROG_TYPE_TRACING &&
2295822965
btf_id_set_contains(&btf_id_deny, btf_id)) {
2295922966
return -EINVAL;
22967+
} else if (prog->expected_attach_type == BPF_TRACE_FEXIT &&
22968+
btf_id_set_contains(&fexit_deny, btf_id)) {
22969+
return -EINVAL;
2296022970
}
2296122971

2296222972
key = bpf_trampoline_compute_key(tgt_prog, prog->aux->attach_btf, btf_id);

0 commit comments

Comments
 (0)