From: sashiko-bot@kernel.org
To: chenyuan_fl@163.com
Cc: bpf@vger.kernel.org
Subject: Re: [PATCH 3/4] selftests/bpf: Test rhtab kptr recycle from NMI context
Date: Mon, 24 Aug 2026 15:28:41 +0000 [thread overview]
Message-ID: <20260824152842.301C51F00A3D@smtp.kernel.org> (raw)
In-Reply-To: <20260824143621.2098856-4-chenyuan_fl@163.com>
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [Medium] Userspace stack out-of-bounds read in `bpf_map_update_elem()` due to mismatched value size.
- [Medium] Double close of the perf_event file descriptor (pmu_fd).
- [Low] Multi-line comments do not follow the mandatory BPF subsystem comment style.
--
--- Patch [3]: [PATCH 3/4] selftests/bpf: Test rhtab kptr recycle from NMI context ---
commit ce5b7999a24e0290b526f254441d70dcbf59a6cf
Author: Yuan Chen <chenyuan@kylinos.cn>
selftests/bpf: Test rhtab kptr recycle from NMI context
This patch introduces a test to verify that the rhtab update and delete
recycle paths do not eagerly destroy referenced kptrs from NMI context.
> diff --git a/tools/testing/selftests/bpf/prog_tests/rhtab_kptr.c b/tools/testing/selftests/bpf/prog_tests/rhtab_kptr.c
> index 0000000000000..13158d74cbc1b
> --- /dev/null
> +++ b/tools/testing/selftests/bpf/prog_tests/rhtab_kptr.c
[ ... ]
> +void test_rhtab_kptr(void)
> +{
> + struct perf_event_attr attr = {
> + .type = PERF_TYPE_HARDWARE,
> + .config = PERF_COUNT_HW_CPU_CYCLES,
> + .freq = 1,
> + .sample_freq = read_perf_max_sample_freq(),
> + .size = sizeof(struct perf_event_attr),
> + };
> + LIBBPF_OPTS(bpf_test_run_opts, topts);
> + struct rhtab_kptr *skel;
> + __u32 key = 0;
> + __u64 zero = 0;
> + __u64 nonnull_before;
> + int pmu_fd, i, err;
> +
> + skel = rhtab_kptr__open_and_load();
> + if (!ASSERT_OK_PTR(skel, "open_and_load"))
> + return;
> +
> + /* Create the element and stash a referenced task kptr in it. */
> + if (!ASSERT_OK(bpf_map_update_elem(bpf_map__fd(skel->maps.rhtab),
> + &key, &zero, BPF_ANY), "create_elem"))
[Severity: Medium]
Does this code cause an out-of-bounds stack read?
The rhtab map expects a value of type struct val_t, which is 16 bytes in size
on 64-bit systems (an 8-byte pointer plus a 4-byte u32 and padding).
However, zero is defined as an 8-byte __u64 local variable. When
bpf_map_update_elem() copies 16 bytes from this address, it will read 8 bytes
of uninitialized or unrelated stack memory adjacent to zero.
> + goto out;
> + if (!ASSERT_OK(bpf_prog_test_run_opts(bpf_program__fd(skel->progs.init_elem),
> + &topts), "test_run_init") ||
> + !ASSERT_EQ(topts.retval, 0, "init_ret"))
> + goto out;
> +
> + pmu_fd = syscall(__NR_perf_event_open, &attr, -1, 0, -1, 0);
> + if (pmu_fd >= 0) {
> + skel->links.nmi_update = bpf_program__attach_perf_event(skel->progs.nmi_update,
> + pmu_fd);
> + if (!ASSERT_OK_PTR(skel->links.nmi_update, "attach_perf_event")) {
> + close(pmu_fd);
> + goto out;
> + }
> +
> + /* Let the NMI handler overwrite the element, and make sure it
[Severity: Low]
This isn't a bug, but does this comment violate the BPF subsystem multi-line
comment style?
The BPF subsystem requires multi-line comments to have the opening /* on its
own line.
> + * actually ran before probing (otherwise the probe would pass
> + * vacuously even on an unfixed kernel).
> + */
> + for (i = 0; i < 20 && read_counter(skel, 1) == 0; i++)
> + usleep(100000);
> + ASSERT_GT(read_counter(skel, 1), 0, "nmi_update_ran");
> +
> + bpf_link__destroy(skel->links.nmi_update);
> + skel->links.nmi_update = NULL;
> + close(pmu_fd);
[Severity: Medium]
Does this result in a double close of pmu_fd?
The function bpf_program__attach_perf_event() takes ownership of the passed
perf_event file descriptor upon successful attachment. When bpf_link__destroy()
is called, it automatically closes the file descriptor.
Calling close(pmu_fd) here explicitly could accidentally close an unrelated file
descriptor opened by another thread.
> +
> + /*
> + * The old kptr must still be attached to the element: the
[ ... ]
> + for (i = 0; i < 2000; i++) {
> + topts.retval = 0;
> + err = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.init_elem),
> + &topts);
> + if (err || topts.retval) {
> + /* Element may be gone; recreate and retry once. */
> + if (!ASSERT_OK(bpf_map_update_elem(bpf_map__fd(skel->maps.rhtab),
> + &key, &zero, BPF_ANY),
[Severity: Medium]
Can this also cause an out-of-bounds stack read?
This is the same issue as above where zero is 8 bytes but the map expects
16 bytes.
> + "recreate_elem"))
> + goto out;
[ ... ]
> diff --git a/tools/testing/selftests/bpf/progs/rhtab_kptr.c b/tools/testing/selftests/bpf/progs/rhtab_kptr.c
> index 0000000000000..fd6bd63cb405e
> --- /dev/null
> +++ b/tools/testing/selftests/bpf/progs/rhtab_kptr.c
[ ... ]
> +struct {
> + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
> + __uint(max_entries, 5);
> + __type(key, __u32);
> + __type(value, __u64);
> +} counters SEC(".maps");
> +
> +/* 0: init ok, 1: nmi update ok, 2: probe xchg non-NULL, 3: probe xchg NULL,
[Severity: Low]
This isn't a bug, but should the opening /* be on its own line to match the BPF
subsystem multi-line comment style?
> + * 4: probe saw expected magic value
> + */
> +static __always_inline void bump(u32 idx)
> +{
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260824143621.2098856-1-chenyuan_fl@163.com?part=3
next prev parent reply other threads:[~2026-08-24 15:28 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-11 9:55 [PATCH bpf-next 0/2] bpf: Cancel special fields in resizable hashtab on recycle chenyuan_fl
2026-08-11 9:55 ` [PATCH bpf-next 1/2] " chenyuan_fl
2026-08-11 10:50 ` bot+bpf-ci
2026-08-11 9:55 ` [PATCH bpf-next 2/2] selftests/bpf: Test rhtab kptr recycle from NMI context chenyuan_fl
2026-08-11 11:08 ` bot+bpf-ci
2026-08-11 14:22 ` [PATCH bpf-next 0/2] bpf: Cancel special fields in resizable hashtab on recycle Kumar Kartikeya Dwivedi
2026-08-24 14:36 ` [PATCH bpf-next v2 0/4] " chenyuan_fl
2026-08-24 14:36 ` [PATCH 1/4] " chenyuan_fl
2026-08-24 15:00 ` sashiko-bot
2026-08-24 15:42 ` bot+bpf-ci
2026-08-24 16:15 ` Mykyta Yatsenko
2026-09-01 6:28 ` [PATCH bpf-next v3 0/4] " chenyuan_fl
2026-09-01 6:28 ` [PATCH bpf-next v3 1/4] " chenyuan_fl
2026-09-01 6:49 ` sashiko-bot
2026-09-01 7:37 ` bot+bpf-ci
2026-09-01 16:57 ` Mykyta Yatsenko
2026-09-01 6:28 ` [PATCH bpf-next v3 2/4] bpf: Fix use-after-free of program BTF in mem-alloc destructor chenyuan_fl
2026-09-01 17:10 ` Mykyta Yatsenko
2026-09-01 6:28 ` [PATCH bpf-next v3 3/4] selftests/bpf: Test rhtab kptr recycle from NMI context chenyuan_fl
2026-09-01 6:40 ` sashiko-bot
2026-09-01 7:37 ` bot+bpf-ci
2026-09-01 6:28 ` [PATCH bpf-next v3 4/4] selftests/bpf: Test rhtab special-field combinations chenyuan_fl
2026-09-01 6:41 ` sashiko-bot
2026-09-01 7:37 ` bot+bpf-ci
2026-09-04 10:49 ` [PATCH bpf-next v3 0/4] bpf: Cancel special fields in resizable hashtab on recycle Kumar Kartikeya Dwivedi
2026-08-24 14:36 ` [PATCH 2/4] bpf: Fix use-after-free of program BTF in mem-alloc destructor chenyuan_fl
2026-08-24 15:17 ` sashiko-bot
2026-08-24 15:42 ` bot+bpf-ci
2026-08-24 14:36 ` [PATCH 3/4] selftests/bpf: Test rhtab kptr recycle from NMI context chenyuan_fl
2026-08-24 15:28 ` sashiko-bot [this message]
2026-08-24 15:42 ` bot+bpf-ci
2026-08-24 14:36 ` [PATCH 4/4] selftests/bpf: Test rhtab special-field combinations chenyuan_fl
2026-08-24 15:40 ` sashiko-bot
2026-08-24 15:42 ` bot+bpf-ci
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=20260824152842.301C51F00A3D@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=chenyuan_fl@163.com \
--cc=sashiko-reviews@lists.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.