From: sashiko-bot@kernel.org
To: "Amery Hung" <ameryhung@gmail.com>
Cc: bpf@vger.kernel.org
Subject: Re: [PATCH bpf-next v1 05/18] bpf: Check helper and kfunc mem+size arguments identically
Date: Thu, 23 Jul 2026 05:52:01 +0000 [thread overview]
Message-ID: <20260723055202.984761F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260723050806.1158442-6-ameryhung@gmail.com>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Pre-existing issues:
- [High] Unchecked nullable pointers passed to helpers with `size > 0` can cause a kernel panic, as the verifier does not enforce a strict correlation between the pointer's runtime NULL state and a zero-size constraint.
--
--- Patch [5]: [PATCH bpf-next v1 05/18] bpf: Check helper and kfunc mem+size arguments identically ---
commit 209f89ec76658f4c319cb2f0b37557c6e39026aa
Author: Amery Hung <ameryhung@gmail.com>
bpf: Check helper and kfunc mem+size arguments identically
This patch unifies the memory and size argument checking between helpers
and kfuncs. By moving the may_be_null handling into check_mem_size_reg(),
it prevents an issue where an un-narrowed map-of-maps value could be
passed to a nullable helper memory argument and leak kernel pointers.
> diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
> index 29d45636c28b8..6520742d51b58 100644
> --- a/kernel/bpf/verifier.c
> +++ b/kernel/bpf/verifier.c
> @@ -6873,7 +6873,14 @@ static int check_mem_size_reg(struct bpf_verifier_env *env,
> bool zero_size_allowed,
> struct bpf_call_arg_meta *meta)
> {
> - int err;
> + bool may_be_null = type_may_be_null(mem_reg->type);
> + struct bpf_reg_state saved_reg;
> + int err = 0;
> +
> + if (may_be_null) {
> + saved_reg = *mem_reg;
> + mark_ptr_not_null_reg(mem_reg);
> + }
[ ... ]
> - err = check_helper_mem_access(env, mem_reg, mem_argno, reg_umax(size_reg),
> - access_type, zero_size_allowed, meta);
> +
> + if (access_type & BPF_READ)
> + err = check_helper_mem_access(env, mem_reg, mem_argno, reg_umax(size_reg),
> + BPF_READ, zero_size_allowed, meta);
> + if (!err && access_type & BPF_WRITE)
> + err = check_helper_mem_access(env, mem_reg, mem_argno, reg_umax(size_reg),
> + BPF_WRITE, zero_size_allowed, meta);
> +
> if (!err) {
> int regno = reg_from_argno(size_argno);
>
> @@ -6920,6 +6933,10 @@ static int check_mem_size_reg(struct bpf_verifier_env *env,
> else
> err = mark_stack_arg_precision(env, arg_idx_from_argno(size_argno));
> }
> +
> + if (may_be_null)
> + *mem_reg = saved_reg;
> +
> return err;
> }
[Severity: High]
This is a pre-existing issue, but by clearing the PTR_MAYBE_NULL flag
temporarily, does this bypass the verifier's check to ensure the size
evaluates to 0 when the pointer is NULL at runtime?
If a BPF program obtains a nullable pointer (for instance, from
bpf_map_lookup_elem) and passes it to a helper with a size greater than 0
without a NULL check, the verifier permits this because it verifies the
bounds as if the pointer is valid.
At runtime, if the pointer is NULL, wouldn't the helper execute and
dereference the NULL pointer? For example, in net/core/filter.c:bpf_csum_diff(),
if from_size or to_size > 0, the pointer is dereferenced by csum_partial():
if (from_size && to_size)
ret = csum_sub(csum_partial(to, to_size, ret),
csum_partial(from, from_size, 0));
else if (to_size)
ret = csum_partial(to, to_size, ret);
else if (from_size)
ret = ~csum_partial(from, from_size, ~ret);
Similarly, in kernel/bpf/helpers.c:bpf_snprintf(), bstr_printf() could be
called without checking if str is NULL when str_size > 0:
err = bstr_printf(str, str_size, fmt, data.bin_args);
Should the verifier emit a runtime check or enforce a constraint to ensure
the size is 0 if a nullable pointer is passed to prevent a kernel panic?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260723050806.1158442-1-ameryhung@gmail.com?part=5
next prev parent reply other threads:[~2026-07-23 5:52 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-23 5:07 [PATCH bpf-next v1 00/18] Generate bpf_func_proto for kfunc Amery Hung
2026-07-23 5:07 ` [PATCH bpf-next v1 01/18] bpf: Drop process_timer_func wrappers Amery Hung
2026-07-23 5:07 ` [PATCH bpf-next v1 02/18] bpf: Unify const map ptr argument checking for helpers and kfuncs Amery Hung
2026-07-23 5:25 ` sashiko-bot
2026-07-23 5:07 ` [PATCH bpf-next v1 03/18] bpf: Split kfunc map argument into __const_map and __map Amery Hung
2026-07-23 5:35 ` sashiko-bot
2026-07-23 5:07 ` [PATCH bpf-next v1 04/18] bpf: Pass kfunc meta to mem and mem_size check Amery Hung
2026-07-23 5:07 ` [PATCH bpf-next v1 05/18] bpf: Check helper and kfunc mem+size arguments identically Amery Hung
2026-07-23 5:52 ` sashiko-bot [this message]
2026-07-23 5:07 ` [PATCH bpf-next v1 06/18] selftests/bpf: Add tests for helper and kfunc mem+size arguments Amery Hung
2026-07-23 5:42 ` sashiko-bot
2026-07-23 5:07 ` [PATCH bpf-next v1 07/18] bpf: Check fixed-size mem args of helpers and kfuncs the same way Amery Hung
2026-07-23 5:57 ` sashiko-bot
2026-07-23 5:07 ` [PATCH bpf-next v1 08/18] bpf: Express ARG_CONST_SIZE_OR_ZERO as ARG_CONST_SIZE | SCALAR_MAYBE_ZERO Amery Hung
2026-07-23 5:07 ` [PATCH bpf-next v1 09/18] bpf: Rename ARG_CONST_SIZE{,_OR_ZERO} to ARG_MEM_SIZE{,_OR_ZERO} Amery Hung
2026-07-23 5:07 ` [PATCH bpf-next v1 10/18] bpf: Fold __szk const size handling into the scalar arg path Amery Hung
2026-07-23 5:07 ` [PATCH bpf-next v1 11/18] bpf: Classify kfunc mem_size args from BTF without register state Amery Hung
2026-07-23 5:08 ` [PATCH bpf-next v1 12/18] bpf: Handle NULL kfunc pointer args without a KF_ARG_PTR_TO_NULL type Amery Hung
2026-07-23 5:08 ` [PATCH bpf-next v1 13/18] bpf: Distinguish fixed- and variable-size kfunc mem args with MEM_FIXED_SIZE Amery Hung
2026-07-23 5:08 ` [PATCH bpf-next v1 14/18] bpf: Check helper mem+size in ARG_PTR_TO_MEM case Amery Hung
2026-07-23 5:08 ` [PATCH bpf-next v1 15/18] bpf: Classify kfunc pointer arguments from BTF, resolve type against the register Amery Hung
2026-07-23 7:27 ` sashiko-bot
2026-07-23 5:08 ` [PATCH bpf-next v1 16/18] bpf: Tag nullable kfunc pointer args with PTR_MAYBE_NULL Amery Hung
2026-07-23 5:08 ` [PATCH bpf-next v1 17/18] bpf: Classify scalar kfunc arguments from BTF Amery Hung
2026-07-23 8:01 ` sashiko-bot
2026-07-23 5:08 ` [PATCH bpf-next v1 18/18] bpf: Generate kfunc argument prototype at add-call time Amery Hung
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=20260723055202.984761F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=ameryhung@gmail.com \
--cc=bpf@vger.kernel.org \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox