]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bpftool: Fix control flow graph segfault during edge creation
authorChristoph Werle <christoph.werle@longjmp.de>
Wed, 8 Jan 2025 22:09:37 +0000 (23:09 +0100)
committerAndrii Nakryiko <andrii@kernel.org>
Fri, 10 Jan 2025 22:16:13 +0000 (14:16 -0800)
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 <christoph.werle@longjmp.de>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Tested-by: Quentin Monnet <qmo@kernel.org>
Reviewed-by: Quentin Monnet <qmo@kernel.org>
Link: https://lore.kernel.org/bpf/20250108220937.1470029-1-christoph.werle@longjmp.de
tools/bpf/bpftool/cfg.c

index eec437cca2ea796120958effc2a02a9c8dd4111c..e3785f9a697de91a4b70a8063cd7afbf8d7385da 100644 (file)
@@ -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;