bpftool: Fix control flow graph segfault during edge creation

JIRA: https://issues.redhat.com/browse/RHEL-85486

commit defac894af93cb347fae0520fe8f14ca36f6fe87
Author: Christoph Werle <christoph.werle@longjmp.de>
Date:   Wed Jan 8 23:09:37 2025 +0100

    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 <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

Signed-off-by: Jerome Marchand <jmarchan@redhat.com>
This commit is contained in:
Jerome Marchand 2025-06-30 11:18:39 +02:00
parent e9e1fe5357
commit 4b0454b104
1 changed files with 1 additions and 0 deletions

View 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;