* [PATCH bpf-next v3 0/5] Object relationship tracking refactor followup
@ 2026-06-05 20:20 Amery Hung
2026-06-05 20:20 ` [PATCH bpf-next v3 1/5] bpf: Fix dead error check on acquire_reference() in check_kfunc_call Amery Hung
` (5 more replies)
0 siblings, 6 replies; 9+ messages in thread
From: Amery Hung @ 2026-06-05 20:20 UTC (permalink / raw)
To: bpf
Cc: netdev, alexei.starovoitov, andrii, daniel, eddyz87, memxor,
martin.lau, mykyta.yatsenko5, ameryhung, kernel-team
Hi,
The main patchset refactoring object relationship tracking in the
verifier has landed and this is a followup that addresses the remaining
feedback in v6 [0].
[0] https://lore.kernel.org/bpf/20260529014936.2811085-1-ameryhung@gmail.com/
v2 -> v3
- Fix cleanup in patch 2 (AI bots)
v1 -> v2
- Add patch 2 fixing silent failure when acquiring reference for
struct_ops argument
- Add patch 4 removing WARN_ON_ONCE in check_ids()
- Add fix tags
Amery Hung (5):
bpf: Fix dead error check on acquire_reference() in check_kfunc_call
bpf: Check acquire_reference() error for "__ref" struct_ops arguments
bpf: Compare parent_id in refsafe() for REF_TYPE_PTR
bpf: Remove WARN_ON_ONCE in check_ids()
selftests/bpf: Use bpf_dynptr_slice() to read file dynptr in leak test
kernel/bpf/states.c | 11 +++++++++--
kernel/bpf/verifier.c | 13 +++++++++----
.../testing/selftests/bpf/progs/file_reader_fail.c | 8 ++++----
3 files changed, 22 insertions(+), 10 deletions(-)
--
2.53.0-Meta
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH bpf-next v3 1/5] bpf: Fix dead error check on acquire_reference() in check_kfunc_call
2026-06-05 20:20 [PATCH bpf-next v3 0/5] Object relationship tracking refactor followup Amery Hung
@ 2026-06-05 20:20 ` Amery Hung
2026-06-05 20:20 ` [PATCH bpf-next v3 2/5] bpf: Check acquire_reference() error for "__ref" struct_ops arguments Amery Hung
` (4 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Amery Hung @ 2026-06-05 20:20 UTC (permalink / raw)
To: bpf
Cc: netdev, alexei.starovoitov, andrii, daniel, eddyz87, memxor,
martin.lau, mykyta.yatsenko5, ameryhung, kernel-team
acquire_reference() returns a signed int that may be a negative errno
but was converted to unsigned, which makes the subsequent error check
deadcode. Fix it by declaring 'id' as int so the error path is taken
correctly.
Fixes: 308c7a0ae885 ("bpf: Refactor object relationship tracking and fix dynptr UAF bug")
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Signed-off-by: Amery Hung <ameryhung@gmail.com>
---
kernel/bpf/verifier.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 8ed484cb1a8a..6446db9628ae 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -12817,9 +12817,10 @@ static int check_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn,
struct bpf_kfunc_call_arg_meta meta;
struct bpf_insn_aux_data *insn_aux;
int err, insn_idx = *insn_idx_p;
- u32 i, nargs, ptr_type_id, id;
const struct btf_param *args;
+ u32 i, nargs, ptr_type_id;
struct btf *desc_btf;
+ int id;
/* skip for now, but return error when we find this in fixup_kfunc_call */
if (!insn->imm)
--
2.53.0-Meta
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH bpf-next v3 2/5] bpf: Check acquire_reference() error for "__ref" struct_ops arguments
2026-06-05 20:20 [PATCH bpf-next v3 0/5] Object relationship tracking refactor followup Amery Hung
2026-06-05 20:20 ` [PATCH bpf-next v3 1/5] bpf: Fix dead error check on acquire_reference() in check_kfunc_call Amery Hung
@ 2026-06-05 20:20 ` Amery Hung
2026-06-05 20:20 ` [PATCH bpf-next v3 3/5] bpf: Compare parent_id in refsafe() for REF_TYPE_PTR Amery Hung
` (3 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Amery Hung @ 2026-06-05 20:20 UTC (permalink / raw)
To: bpf
Cc: netdev, alexei.starovoitov, andrii, daniel, eddyz87, memxor,
martin.lau, mykyta.yatsenko5, ameryhung, kernel-team
When acquiring references for struct_ops program arguments tagged with
"__ref", the return value of acquire_reference() was stored directly
into u32 ctx_arg_info[i].ref_id without checking for failure.
acquire_reference() returns -ENOMEM when acquire_reference_state() fails
to allocate, so the error was silently stored as a ref_id instead of
aborting verification. Fix it by checking the return.
Fixes: a687df2008f6 ("bpf: Support getting referenced kptr from struct_ops argument")
Signed-off-by: Amery Hung <ameryhung@gmail.com>
---
kernel/bpf/verifier.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 6446db9628ae..80a72402463d 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -18362,9 +18362,13 @@ static int do_check_common(struct bpf_verifier_env *env, int subprog)
/* Acquire references for struct_ops program arguments tagged with "__ref" */
if (!subprog && env->prog->type == BPF_PROG_TYPE_STRUCT_OPS) {
- for (i = 0; i < aux->ctx_arg_info_size; i++)
- aux->ctx_arg_info[i].ref_id = aux->ctx_arg_info[i].refcounted ?
- acquire_reference(env, 0, 0) : 0;
+ for (i = 0; i < aux->ctx_arg_info_size; i++) {
+ ret = aux->ctx_arg_info[i].refcounted ? acquire_reference(env, 0, 0) : 0;
+ if (ret < 0)
+ goto out;
+
+ aux->ctx_arg_info[i].ref_id = ret;
+ }
}
ret = do_check(env);
--
2.53.0-Meta
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH bpf-next v3 3/5] bpf: Compare parent_id in refsafe() for REF_TYPE_PTR
2026-06-05 20:20 [PATCH bpf-next v3 0/5] Object relationship tracking refactor followup Amery Hung
2026-06-05 20:20 ` [PATCH bpf-next v3 1/5] bpf: Fix dead error check on acquire_reference() in check_kfunc_call Amery Hung
2026-06-05 20:20 ` [PATCH bpf-next v3 2/5] bpf: Check acquire_reference() error for "__ref" struct_ops arguments Amery Hung
@ 2026-06-05 20:20 ` Amery Hung
2026-06-05 20:50 ` bot+bpf-ci
2026-06-05 20:20 ` [PATCH bpf-next v3 4/5] bpf: Remove WARN_ON_ONCE in check_ids() Amery Hung
` (2 subsequent siblings)
5 siblings, 1 reply; 9+ messages in thread
From: Amery Hung @ 2026-06-05 20:20 UTC (permalink / raw)
To: bpf
Cc: netdev, alexei.starovoitov, andrii, daniel, eddyz87, memxor,
martin.lau, mykyta.yatsenko5, ameryhung, kernel-team
refsafe() compared each reference's id and type but not its parent_id,
so two states whose PTR references differ only in the parent object they
were derived from could be wrongly treated as equivalent and pruned. Fix
it by checking parent_id too.
Fixes: 308c7a0ae885 ("bpf: Refactor object relationship tracking and fix dynptr UAF bug")
Signed-off-by: Amery Hung <ameryhung@gmail.com>
---
kernel/bpf/states.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/kernel/bpf/states.c b/kernel/bpf/states.c
index 5945956a7573..06d9ae24f006 100644
--- a/kernel/bpf/states.c
+++ b/kernel/bpf/states.c
@@ -890,6 +890,9 @@ static bool refsafe(struct bpf_verifier_state *old, struct bpf_verifier_state *c
return false;
switch (old->refs[i].type) {
case REF_TYPE_PTR:
+ if (!check_ids(old->refs[i].parent_id, cur->refs[i].parent_id, idmap))
+ return false;
+ break;
case REF_TYPE_IRQ:
break;
case REF_TYPE_LOCK:
--
2.53.0-Meta
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH bpf-next v3 4/5] bpf: Remove WARN_ON_ONCE in check_ids()
2026-06-05 20:20 [PATCH bpf-next v3 0/5] Object relationship tracking refactor followup Amery Hung
` (2 preceding siblings ...)
2026-06-05 20:20 ` [PATCH bpf-next v3 3/5] bpf: Compare parent_id in refsafe() for REF_TYPE_PTR Amery Hung
@ 2026-06-05 20:20 ` Amery Hung
2026-06-05 20:50 ` bot+bpf-ci
2026-06-05 20:20 ` [PATCH bpf-next v3 5/5] selftests/bpf: Use bpf_dynptr_slice() to read file dynptr in leak test Amery Hung
2026-06-05 21:20 ` [PATCH bpf-next v3 0/5] Object relationship tracking refactor followup patchwork-bot+netdevbpf
5 siblings, 1 reply; 9+ messages in thread
From: Amery Hung @ 2026-06-05 20:20 UTC (permalink / raw)
To: bpf
Cc: netdev, alexei.starovoitov, andrii, daniel, eddyz87, memxor,
martin.lau, mykyta.yatsenko5, ameryhung, kernel-team
check_ids() warned when it ran out of idmap slots, assuming this was
impossible because the slots are bounded by the number of registers and
stack slots. That assumption no longer holds: referenced dynptrs acquire
an intermediate reference that lives in refs[] but is not backed by any
register or stack slot [0], so a program can accumulate more reference
ids than the idmap can hold and exhaust it.
Exhaustion is fine for verification correctness. check_ids() already
returns false, which makes the states compare as not equivalent and
prevents unsound pruning. The only effect of the WARN_ON_ONCE() is log
noise, or a panic under panic_on_warn. Drop the warning and keep
returning false.
[0] 308c7a0ae885 ("bpf: Refactor object relationship tracking and fix dynptr UAF bug")
Signed-off-by: Amery Hung <ameryhung@gmail.com>
---
kernel/bpf/states.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/kernel/bpf/states.c b/kernel/bpf/states.c
index 06d9ae24f006..32f346ce3ffc 100644
--- a/kernel/bpf/states.c
+++ b/kernel/bpf/states.c
@@ -343,8 +343,12 @@ static bool check_ids(u32 old_id, u32 cur_id, struct bpf_idmap *idmap)
return true;
}
- /* We ran out of idmap slots, which should be impossible */
- WARN_ON_ONCE(1);
+ /*
+ * idmap slots are bounded by the number of registers and stack slots.
+ * Since referenced dynptrs acquire intermediate references that do
+ * not live in either, so the map can be exhausted. Since it is unlikely,
+ * fail the verification by treating the states as not equivalent.
+ */
return false;
}
--
2.53.0-Meta
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH bpf-next v3 5/5] selftests/bpf: Use bpf_dynptr_slice() to read file dynptr in leak test
2026-06-05 20:20 [PATCH bpf-next v3 0/5] Object relationship tracking refactor followup Amery Hung
` (3 preceding siblings ...)
2026-06-05 20:20 ` [PATCH bpf-next v3 4/5] bpf: Remove WARN_ON_ONCE in check_ids() Amery Hung
@ 2026-06-05 20:20 ` Amery Hung
2026-06-05 21:20 ` [PATCH bpf-next v3 0/5] Object relationship tracking refactor followup patchwork-bot+netdevbpf
5 siblings, 0 replies; 9+ messages in thread
From: Amery Hung @ 2026-06-05 20:20 UTC (permalink / raw)
To: bpf
Cc: netdev, alexei.starovoitov, andrii, daniel, eddyz87, memxor,
martin.lau, mykyta.yatsenko5, ameryhung, kernel-team
use_file_dynptr_slice_after_put_file() reads the dynptr via
bpf_dynptr_data(), which always returns NULL for a read-only file
dynptr, making the example confusing. Switch to bpf_dynptr_slice(), the
correct read API for file dynptrs, and read (rather than write) the slice
since it is read-only. The test still fails as expected.
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Signed-off-by: Amery Hung <ameryhung@gmail.com>
---
tools/testing/selftests/bpf/progs/file_reader_fail.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/tools/testing/selftests/bpf/progs/file_reader_fail.c b/tools/testing/selftests/bpf/progs/file_reader_fail.c
index d5fae5e4cf9a..3bb9e2612f8f 100644
--- a/tools/testing/selftests/bpf/progs/file_reader_fail.c
+++ b/tools/testing/selftests/bpf/progs/file_reader_fail.c
@@ -87,7 +87,8 @@ int use_file_dynptr_slice_after_put_file(void *ctx)
struct task_struct *task = bpf_get_current_task_btf();
struct file *file = bpf_get_task_exe_file(task);
struct bpf_dynptr dynptr;
- char *data;
+ char buf[1];
+ const char *data;
if (!file)
return 0;
@@ -95,15 +96,14 @@ int use_file_dynptr_slice_after_put_file(void *ctx)
if (bpf_dynptr_from_file(file, 0, &dynptr))
goto out;
- data = bpf_dynptr_data(&dynptr, 0, 1);
+ data = bpf_dynptr_slice(&dynptr, 0, buf, sizeof(buf));
if (!data)
goto out;
/* this should fail - file dynptr should be discarded first to prevent resource leak */
bpf_put_file(file);
- *data = 'x';
- return 0;
+ return data[0];
out:
bpf_dynptr_file_discard(&dynptr);
--
2.53.0-Meta
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH bpf-next v3 3/5] bpf: Compare parent_id in refsafe() for REF_TYPE_PTR
2026-06-05 20:20 ` [PATCH bpf-next v3 3/5] bpf: Compare parent_id in refsafe() for REF_TYPE_PTR Amery Hung
@ 2026-06-05 20:50 ` bot+bpf-ci
0 siblings, 0 replies; 9+ messages in thread
From: bot+bpf-ci @ 2026-06-05 20:50 UTC (permalink / raw)
To: ameryhung, bpf
Cc: netdev, alexei.starovoitov, andrii, daniel, eddyz87, memxor,
martin.lau, mykyta.yatsenko5, ameryhung, kernel-team, ast, andrii,
daniel, martin.lau, eddyz87, yonghong.song, clm, ihor.solodrai
[-- Attachment #1: Type: text/plain, Size: 1907 bytes --]
> diff --git a/kernel/bpf/states.c b/kernel/bpf/states.c
> index 5945956a7573..06d9ae24f006 100644
> --- a/kernel/bpf/states.c
> +++ b/kernel/bpf/states.c
> @@ -890,6 +890,9 @@ static bool refsafe(struct bpf_verifier_state *old, struct bpf_verifier_state *c
> return false;
> switch (old->refs[i].type) {
> case REF_TYPE_PTR:
> + if (!check_ids(old->refs[i].parent_id, cur->refs[i].parent_id, idmap))
> + return false;
> + break;
Feeding parent_id through check_ids() here was raised during review (by
the bpf-ci and Sashiko bots and by Eduard Zingerman on v1) as something
that makes BPF_ID_MAP_SIZE exhaustion more reachable, which would hit the
WARN_ON_ONCE(1) in check_ids() and become a DoS under panic_on_warn.
The agreed resolution in that discussion was to drop the WARN_ON_ONCE(1)
in check_ids(), since not all ids correspond to register or stack slots
anymore:
https://lore.kernel.org/bpf/6d86c2fae9be63eb110ebd5b3fc19bc4cf1de2dc.camel@gmail.com/
"I agree that it should be fine to just return false from check_ids()
if there is no space in the idmap. However, since not all ids
correspond to register/stack slots anymore, I think that
WARN_ON_ONCE(1) should be removed."
The reply indicated that removal lands in patch 4 of the series. In this
branch only 3 patches are present, and check_ids() still contains the
WARN_ON_ONCE(1):
kernel/bpf/states.c:check_ids() {
...
/* We ran out of idmap slots, which should be impossible */
WARN_ON_ONCE(1);
return false;
}
Should the WARN_ON_ONCE(1) removal be applied together with this change,
so the parent_id comparison is not added before its dependent fix is in
place?
---
AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md
CI run summary: https://github.com/kernel-patches/bpf/actions/runs/27038754519
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH bpf-next v3 4/5] bpf: Remove WARN_ON_ONCE in check_ids()
2026-06-05 20:20 ` [PATCH bpf-next v3 4/5] bpf: Remove WARN_ON_ONCE in check_ids() Amery Hung
@ 2026-06-05 20:50 ` bot+bpf-ci
0 siblings, 0 replies; 9+ messages in thread
From: bot+bpf-ci @ 2026-06-05 20:50 UTC (permalink / raw)
To: ameryhung, bpf
Cc: netdev, alexei.starovoitov, andrii, daniel, eddyz87, memxor,
martin.lau, mykyta.yatsenko5, ameryhung, kernel-team, ast, andrii,
daniel, martin.lau, eddyz87, yonghong.song, clm, ihor.solodrai
[-- Attachment #1: Type: text/plain, Size: 1566 bytes --]
> bpf: Remove WARN_ON_ONCE in check_ids()
>
> check_ids() warned when it ran out of idmap slots, assuming this was
> impossible because the slots are bounded by the number of registers and
> stack slots. That assumption no longer holds: referenced dynptrs acquire
> an intermediate reference that lives in refs[] but is not backed by any
> register or stack slot [0], so a program can accumulate more reference
> ids than the idmap can hold and exhaust it.
> Exhaustion is fine for verification correctness. check_ids() already
> returns false, which makes the states compare as not equivalent and
> prevents unsound pruning. The only effect of the WARN_ON_ONCE() is log
> noise, or a panic under panic_on_warn. Drop the warning and keep
> returning false.
> [0] 308c7a0ae885 ("bpf: Refactor object relationship tracking and fix dynptr UAF bug")
> Signed-off-by: Amery Hung <ameryhung@gmail.com>
This looks like a bug fix for a warning that can panic under
panic_on_warn, but it does not carry a Fixes: tag. The body attributes
the newly reachable exhaustion to commit 308c7a0ae885, which introduced
referenced dynptrs that acquire an intermediate reference in refs[] not
backed by any register or stack slot.
Should this include:
Fixes: 308c7a0ae885 ("bpf: Refactor object relationship tracking and fix dynptr UAF bug")
---
AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md
CI run summary: https://github.com/kernel-patches/bpf/actions/runs/27038754519
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH bpf-next v3 0/5] Object relationship tracking refactor followup
2026-06-05 20:20 [PATCH bpf-next v3 0/5] Object relationship tracking refactor followup Amery Hung
` (4 preceding siblings ...)
2026-06-05 20:20 ` [PATCH bpf-next v3 5/5] selftests/bpf: Use bpf_dynptr_slice() to read file dynptr in leak test Amery Hung
@ 2026-06-05 21:20 ` patchwork-bot+netdevbpf
5 siblings, 0 replies; 9+ messages in thread
From: patchwork-bot+netdevbpf @ 2026-06-05 21:20 UTC (permalink / raw)
To: Amery Hung
Cc: bpf, netdev, alexei.starovoitov, andrii, daniel, eddyz87, memxor,
martin.lau, mykyta.yatsenko5, kernel-team
Hello:
This series was applied to bpf/bpf-next.git (master)
by Alexei Starovoitov <ast@kernel.org>:
On Fri, 5 Jun 2026 13:20:51 -0700 you wrote:
> Hi,
>
> The main patchset refactoring object relationship tracking in the
> verifier has landed and this is a followup that addresses the remaining
> feedback in v6 [0].
>
> [0] https://lore.kernel.org/bpf/20260529014936.2811085-1-ameryhung@gmail.com/
>
> [...]
Here is the summary with links:
- [bpf-next,v3,1/5] bpf: Fix dead error check on acquire_reference() in check_kfunc_call
https://git.kernel.org/bpf/bpf-next/c/a3863aa4f55e
- [bpf-next,v3,2/5] bpf: Check acquire_reference() error for "__ref" struct_ops arguments
https://git.kernel.org/bpf/bpf-next/c/73d475dc6c13
- [bpf-next,v3,3/5] bpf: Compare parent_id in refsafe() for REF_TYPE_PTR
https://git.kernel.org/bpf/bpf-next/c/41025f441fe6
- [bpf-next,v3,4/5] bpf: Remove WARN_ON_ONCE in check_ids()
https://git.kernel.org/bpf/bpf-next/c/ac7f6c9da6b6
- [bpf-next,v3,5/5] selftests/bpf: Use bpf_dynptr_slice() to read file dynptr in leak test
https://git.kernel.org/bpf/bpf-next/c/d83d4f63cb8f
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-06-05 21:20 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-05 20:20 [PATCH bpf-next v3 0/5] Object relationship tracking refactor followup Amery Hung
2026-06-05 20:20 ` [PATCH bpf-next v3 1/5] bpf: Fix dead error check on acquire_reference() in check_kfunc_call Amery Hung
2026-06-05 20:20 ` [PATCH bpf-next v3 2/5] bpf: Check acquire_reference() error for "__ref" struct_ops arguments Amery Hung
2026-06-05 20:20 ` [PATCH bpf-next v3 3/5] bpf: Compare parent_id in refsafe() for REF_TYPE_PTR Amery Hung
2026-06-05 20:50 ` bot+bpf-ci
2026-06-05 20:20 ` [PATCH bpf-next v3 4/5] bpf: Remove WARN_ON_ONCE in check_ids() Amery Hung
2026-06-05 20:50 ` bot+bpf-ci
2026-06-05 20:20 ` [PATCH bpf-next v3 5/5] selftests/bpf: Use bpf_dynptr_slice() to read file dynptr in leak test Amery Hung
2026-06-05 21:20 ` [PATCH bpf-next v3 0/5] Object relationship tracking refactor followup patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox