Commit 9b2f6fec authored by Andrii Nakryiko's avatar Andrii Nakryiko Committed by Daniel Borkmann
Browse files

libbpf: Fix detection of BPF helper call instruction



BPF_CALL | BPF_JMP32 is explicitly not allowed by verifier for BPF helper
calls, so don't detect it as a valid call. Also drop the check on func_id
pointer, as it's currently always non-null.

Fixes: 109cea5a ("libbpf: Sanitize BPF program code for bpf_probe_read_{kernel, user}[_str]")
Reported-by: default avatarYonghong Song <yhs@fb.com>
Signed-off-by: default avatarAndrii Nakryiko <andriin@fb.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Acked-by: default avatarYonghong Song <yhs@fb.com>
Link: https://lore.kernel.org/bpf/20200820061411.1755905-1-andriin@fb.com
parent 0bc23a1d
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -5840,13 +5840,11 @@ static int bpf_object__collect_reloc(struct bpf_object *obj)

static bool insn_is_helper_call(struct bpf_insn *insn, enum bpf_func_id *func_id)
{
	__u8 class = BPF_CLASS(insn->code);

	if ((class == BPF_JMP || class == BPF_JMP32) &&
	if (BPF_CLASS(insn->code) == BPF_JMP &&
	    BPF_OP(insn->code) == BPF_CALL &&
	    BPF_SRC(insn->code) == BPF_K &&
	    insn->src_reg == 0 && insn->dst_reg == 0) {
		    if (func_id)
	    insn->src_reg == 0 &&
	    insn->dst_reg == 0) {
		    *func_id = insn->imm;
		    return true;
	}