60 lines
2.3 KiB
Diff
60 lines
2.3 KiB
Diff
From 0ff6d28aecf2980407ccbb7b79727f3349f74510 Mon Sep 17 00:00:00 2001
|
|
From: Andrii Nakryiko <andrii@kernel.org>
|
|
Date: Fri, 9 Sep 2022 12:30:52 -0700
|
|
Subject: [PATCH] libbpf: Fix crash if SEC("freplace") programs don't have
|
|
attach_prog_fd set
|
|
|
|
Fix SIGSEGV caused by libbpf trying to find attach type in vmlinux BTF
|
|
for freplace programs. It's wrong to search in vmlinux BTF and libbpf
|
|
doesn't even mark vmlinux BTF as required for freplace programs. So
|
|
trying to search anything in obj->vmlinux_btf might cause NULL
|
|
dereference if nothing else in BPF object requires vmlinux BTF.
|
|
|
|
Instead, error out if freplace (EXT) program doesn't specify
|
|
attach_prog_fd during at the load time.
|
|
|
|
Fixes: 91abb4a6d79d ("libbpf: Support attachment of BPF tracing programs to kernel modules")
|
|
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
|
|
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
|
|
Link: https://lore.kernel.org/bpf/20220909193053.577111-3-andrii@kernel.org
|
|
---
|
|
src/libbpf.c | 13 +++++++++----
|
|
1 file changed, 9 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/src/libbpf.c b/src/libbpf.c
|
|
index 3ad1392..2ca30cc 100644
|
|
--- a/src/libbpf.c
|
|
+++ b/src/libbpf.c
|
|
@@ -9084,11 +9084,15 @@ static int libbpf_find_attach_btf_id(struct bpf_program *prog, const char *attac
|
|
int err = 0;
|
|
|
|
/* BPF program's BTF ID */
|
|
- if (attach_prog_fd) {
|
|
+ if (prog->type == BPF_PROG_TYPE_EXT || attach_prog_fd) {
|
|
+ if (!attach_prog_fd) {
|
|
+ pr_warn("prog '%s': attach program FD is not set\n", prog->name);
|
|
+ return -EINVAL;
|
|
+ }
|
|
err = libbpf_find_prog_btf_id(attach_name, attach_prog_fd);
|
|
if (err < 0) {
|
|
- pr_warn("failed to find BPF program (FD %d) BTF ID for '%s': %d\n",
|
|
- attach_prog_fd, attach_name, err);
|
|
+ pr_warn("prog '%s': failed to find BPF program (FD %d) BTF ID for '%s': %d\n",
|
|
+ prog->name, attach_prog_fd, attach_name, err);
|
|
return err;
|
|
}
|
|
*btf_obj_fd = 0;
|
|
@@ -9105,7 +9109,8 @@ static int libbpf_find_attach_btf_id(struct bpf_program *prog, const char *attac
|
|
err = find_kernel_btf_id(prog->obj, attach_name, attach_type, btf_obj_fd, btf_type_id);
|
|
}
|
|
if (err) {
|
|
- pr_warn("failed to find kernel BTF type ID of '%s': %d\n", attach_name, err);
|
|
+ pr_warn("prog '%s': failed to find kernel BTF type ID of '%s': %d\n",
|
|
+ prog->name, attach_name, err);
|
|
return err;
|
|
}
|
|
return 0;
|
|
--
|
|
2.33.0
|
|
|