BPF List
 help / color / mirror / Atom feed
From: Andrii Nakryiko <andrii@kernel.org>
To: bpf@vger.kernel.org, ast@kernel.org, daniel@iogearbox.net,
	martin.lau@kernel.org
Cc: andrii@kernel.org, kernel-team@meta.com
Subject: [PATCH bpf-next 2/7] libbpf: handle yet another corner case of nulling out struct_ops program
Date: Mon,  6 May 2024 17:13:30 -0700	[thread overview]
Message-ID: <20240507001335.1445325-3-andrii@kernel.org> (raw)
In-Reply-To: <20240507001335.1445325-1-andrii@kernel.org>

There is yet another corner case where user can set STRUCT_OPS program
reference in STRUCT_OPS map to NULL, but libbpf will fail to disable
autoload for such BPF program. This time it's the case of "new" kernel
which has type information about callback field, but user explicitly
nulled-out program reference from user-space after opening BPF object.

Fix, hopefully, the last remaining unhandled case.

Fixes: 0737df6de946 ("libbpf: better fix for handling nulled-out struct_ops program")
Fixes: f973fccd43d3 ("libbpf: handle nulled-out program in struct_ops correctly")
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
---
 tools/lib/bpf/libbpf.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 7d77a1b158ce..04de4fb81785 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -1193,11 +1193,19 @@ static int bpf_map__init_kern_struct_ops(struct bpf_map *map)
 		}
 
 		if (btf_is_ptr(mtype)) {
-			/* Update the value from the shadow type */
 			prog = *(void **)mdata;
+			/* just like for !kern_member case above, reset declaratively
+			 * set (at compile time) program's autload to false,
+			 * if user replaced it with another program or NULL
+			 */
+			if (st_ops->progs[i] && st_ops->progs[i] != prog)
+				st_ops->progs[i]->autoload = false;
+
+			/* Update the value from the shadow type */
 			st_ops->progs[i] = prog;
 			if (!prog)
 				continue;
+
 			if (!is_valid_st_ops_program(obj, prog)) {
 				pr_warn("struct_ops init_kern %s: member %s is not a struct_ops program\n",
 					map->name, mname);
-- 
2.43.0


  parent reply	other threads:[~2024-05-07  0:13 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-07  0:13 [PATCH bpf-next 0/7] libbpf: further struct_ops fixes and improvements Andrii Nakryiko
2024-05-07  0:13 ` [PATCH bpf-next 1/7] libbpf: remove unnecessary struct_ops prog validity check Andrii Nakryiko
2024-05-07  0:13 ` Andrii Nakryiko [this message]
2024-05-07  0:13 ` [PATCH bpf-next 3/7] selftests/bpf: add another struct_ops callback use case test Andrii Nakryiko
2024-05-07  0:13 ` [PATCH bpf-next 4/7] libbpf: fix libbpf_strerror_r() handling unknown errors Andrii Nakryiko
2024-05-07  0:13 ` [PATCH bpf-next 5/7] libbpf: improve early detection of doomed-to-fail BPF program loading Andrii Nakryiko
2024-05-07  0:13 ` [PATCH bpf-next 6/7] selftests/bpf: validate struct_ops early failure detection logic Andrii Nakryiko
2024-05-07  0:13 ` [PATCH bpf-next 7/7] selftests/bpf: shorten subtest names for struct_ops_module test Andrii Nakryiko
2024-05-08  0:30 ` [PATCH bpf-next 0/7] libbpf: further struct_ops fixes and improvements patchwork-bot+netdevbpf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240507001335.1445325-3-andrii@kernel.org \
    --to=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=kernel-team@meta.com \
    --cc=martin.lau@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox