From: Jiayuan Chen <jiayuan.chen@linux.dev>
To: bpf@vger.kernel.org
Cc: Jiayuan Chen <jiayuan.chen@linux.dev>,
syzbot+37b56485bbbf90ad8489@syzkaller.appspotmail.com,
Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Andrii Nakryiko <andrii@kernel.org>,
Eduard Zingerman <eddyz87@gmail.com>,
Kumar Kartikeya Dwivedi <memxor@gmail.com>,
Martin KaFai Lau <martin.lau@linux.dev>,
Song Liu <song@kernel.org>,
Yonghong Song <yonghong.song@linux.dev>,
Jiri Olsa <jolsa@kernel.org>,
Emil Tsalapatis <emil@etsalapatis.com>,
Ihor Solodrai <ihor.solodrai@linux.dev>,
Shuah Khan <shuah@kernel.org>,
Mykyta Yatsenko <yatsenko@meta.com>,
linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org
Subject: [PATCH bpf 1/2] bpf: Fix NULL-ptr-deref when dumping a key-less BTF hash map
Date: Fri, 28 Aug 2026 17:31:16 +0800 [thread overview]
Message-ID: <20260828093142.179856-1-jiayuan.chen@linux.dev> (raw)
map_check_btf() allows a key-less BTF (btf_key_type_id == 0) only for maps
that have a ->map_check_btf callback, and leaves the actual decision to
that callback. Hash maps used to have no ->map_check_btf, so a key-less
BTF was rejected outright.
That changed once htab and rhtab got a ->map_check_btf to register a dtor:
the callback does not look at the key, so a key-less hash map now passes
map_check_btf() and gets created. Reading it back through bpffs then feeds
the key type_id 0 into btf_type_seq_show(); btf_type_by_id() returns the
void type, kind_ops[BTF_KIND_UNKN] is NULL, and btf_type_show()
dereferences it:
KASAN: null-ptr-deref in range [0x0000000000000028-0x000000000000002f]
RIP: 0010:btf_type_show (kernel/bpf/btf.c:8251)
Call Trace:
<TASK>
btf_type_seq_show_flags (kernel/bpf/btf.c:8269)
btf_type_seq_show (kernel/bpf/btf.c:8277)
htab_map_seq_show_elem (kernel/bpf/hashtab.c:1669)
map_seq_show (kernel/bpf/inode.c:293)
seq_read_iter (fs/seq_file.c:273)
seq_read (fs/seq_file.c:163)
vfs_read (fs/read_write.c:572)
ksys_read (fs/read_write.c:716)
__x64_sys_read (fs/read_write.c:725)
do_syscall_64 (arch/x86/entry/syscall_64.c:61)
entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121)
</TASK>
Only array maps have a use for a key-less BTF (DataSec global data). Reject
it in htab_map_check_btf() and rhtab_map_check_btf(), restoring the
previous behavior, and also let btf_type_show() bail out on a type with no
show op instead of dereferencing NULL, so any other path that reaches it
with a void type degrades gracefully.
Fixes: 1df97a7453ee ("bpf: Register dtor for freeing special fields")
Fixes: 6905f8601298 ("bpf: Allow special fields in resizable hashtab")
Reported-by: syzbot+37b56485bbbf90ad8489@syzkaller.appspotmail.com
Closes: https://lore.kernel.org/all/6a8f4e88.27659fcc.2ceef7.0008.GAE@google.com/T/
Signed-off-by: Jiayuan Chen <jiayuan.chen@linux.dev>
---
kernel/bpf/btf.c | 4 ++++
kernel/bpf/hashtab.c | 8 ++++++++
2 files changed, 12 insertions(+)
diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
index 91b8ce77f699..3dbbbac4dd2e 100644
--- a/kernel/bpf/btf.c
+++ b/kernel/bpf/btf.c
@@ -8248,6 +8248,10 @@ static void btf_type_show(const struct btf *btf, u32 type_id, void *obj,
memset(&show->state, 0, sizeof(show->state));
memset(&show->obj, 0, sizeof(show->obj));
+ /* A void type (e.g. type_id 0) has no show op, don't deref NULL. */
+ if (!t || !btf_type_ops(t))
+ return;
+
btf_type_ops(t)->show(btf, t, type_id, obj, 0, show);
}
diff --git a/kernel/bpf/hashtab.c b/kernel/bpf/hashtab.c
index d40cb5dd446c..299859c58b41 100644
--- a/kernel/bpf/hashtab.c
+++ b/kernel/bpf/hashtab.c
@@ -530,6 +530,10 @@ static int htab_map_check_btf(struct bpf_map *map, const struct btf *btf,
{
struct bpf_htab *htab = container_of(map, struct bpf_htab, map);
+ /* Unlike array maps, hash maps have no use for a key-less BTF. */
+ if (btf_type_is_void(key_type))
+ return -EINVAL;
+
if (htab_is_prealloc(htab))
return 0;
/*
@@ -3110,6 +3114,10 @@ static int rhtab_map_check_btf(struct bpf_map *map, const struct btf *btf,
{
struct bpf_rhtab *rhtab = container_of(map, struct bpf_rhtab, map);
+ /* Unlike array maps, hash maps have no use for a key-less BTF. */
+ if (btf_type_is_void(key_type))
+ return -EINVAL;
+
return bpf_ma_set_dtor(map, &rhtab->ma, rhtab_mem_dtor);
}
--
2.43.0
next reply other threads:[~2026-08-28 9:31 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-28 9:31 Jiayuan Chen [this message]
2026-08-28 9:31 ` [PATCH bpf 2/2] selftests/bpf: Add test for key-less BTF hash map Jiayuan Chen
2026-08-28 10:17 ` bot+bpf-ci
2026-08-28 9:54 ` [PATCH bpf 1/2] bpf: Fix NULL-ptr-deref when dumping a " sashiko-bot
2026-08-28 10:51 ` Jiayuan Chen
2026-08-28 22:28 ` Kumar Kartikeya Dwivedi
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=20260828093142.179856-1-jiayuan.chen@linux.dev \
--to=jiayuan.chen@linux.dev \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=emil@etsalapatis.com \
--cc=ihor.solodrai@linux.dev \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=martin.lau@linux.dev \
--cc=memxor@gmail.com \
--cc=shuah@kernel.org \
--cc=song@kernel.org \
--cc=syzbot+37b56485bbbf90ad8489@syzkaller.appspotmail.com \
--cc=yatsenko@meta.com \
--cc=yonghong.song@linux.dev \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.