| From a2ab6fb298c00d45b603cec8621670515963fafe Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 13 Feb 2026 21:29:49 +0000 |
| Subject: bpf: Add a map/btf from a fd array more consistently |
| |
| From: Anton Protopopov <a.s.protopopov@gmail.com> |
| |
| [ Upstream commit b0b1a8583d8e797114e613139e3e3318a1704690 ] |
| |
| The add_fd_from_fd_array() function takes a file descriptor as a |
| parameter and tries to add either map or btf to the corresponding |
| list of used objects. As was reported by Dan Carpenter, since the |
| commit c81e4322acf0 ("bpf: Fix a potential use-after-free of BTF |
| object"), the fdget() is called twice on the file descriptor, and |
| thus userspace, potentially, can replace the file pointed to by the |
| file descriptor in between the two calls. On practice, this shouldn't |
| break anything on the kernel side, but for consistency fix the code |
| such that only one fdget() is executed. |
| |
| Reported-by: Dan Carpenter <dan.carpenter@linaro.org> |
| Closes: https://lore.kernel.org/r/aY689z7gHNv8rgVO@stanley.mountain/ |
| Fixes: ccd2d799ed44 ("bpf: Fix a potential use-after-free of BTF object") |
| Signed-off-by: Anton Protopopov <a.s.protopopov@gmail.com> |
| Link: https://lore.kernel.org/r/20260213212949.759321-1-a.s.protopopov@gmail.com |
| Signed-off-by: Alexei Starovoitov <ast@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/bpf/verifier.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c |
| index a16aca34f5834..fe01edfcc34c6 100644 |
| --- a/kernel/bpf/verifier.c |
| +++ b/kernel/bpf/verifier.c |
| @@ -24658,9 +24658,11 @@ static int add_fd_from_fd_array(struct bpf_verifier_env *env, int fd) |
| return 0; |
| } |
| |
| - btf = btf_get_by_fd(fd); |
| - if (!IS_ERR(btf)) |
| + btf = __btf_get_by_fd(f); |
| + if (!IS_ERR(btf)) { |
| + btf_get(btf); |
| return __add_used_btf(env, btf); |
| + } |
| |
| verbose(env, "fd %d is not pointing to valid bpf_map or btf\n", fd); |
| return PTR_ERR(map); |
| -- |
| 2.51.0 |
| |