From: Christoph Werle Date: Wed, 8 Jan 2025 22:09:37 +0000 (+0100) Subject: bpftool: Fix control flow graph segfault during edge creation X-Git-Tag: v6.14-rc1~133^2~15 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=defac894af93cb347fae0520fe8f14ca36f6fe87;p=thirdparty%2Flinux.git bpftool: Fix control flow graph segfault during edge creation If the last instruction of a control flow graph building block is a BPF_CALL, an incorrect edge with e->dst set to NULL is created and results in a segfault during graph output. Ensure that BPF_CALL as last instruction of a building block is handled correctly and only generates a single edge unlike actual BPF_JUMP* instructions. Signed-off-by: Christoph Werle Signed-off-by: Andrii Nakryiko Tested-by: Quentin Monnet Reviewed-by: Quentin Monnet Link: https://lore.kernel.org/bpf/20250108220937.1470029-1-christoph.werle@longjmp.de --- diff --git a/tools/bpf/bpftool/cfg.c b/tools/bpf/bpftool/cfg.c index eec437cca2ea7..e3785f9a697de 100644 --- a/tools/bpf/bpftool/cfg.c +++ b/tools/bpf/bpftool/cfg.c @@ -302,6 +302,7 @@ static bool func_add_bb_edges(struct func_node *func) insn = bb->tail; if (!is_jmp_insn(insn->code) || + BPF_OP(insn->code) == BPF_CALL || BPF_OP(insn->code) == BPF_EXIT) { e->dst = bb_next(bb); e->flags |= EDGE_FLAG_FALLTHROUGH;