All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yonghong Song <yonghong.song@linux.dev>
To: sashiko-reviews@lists.linux.dev
Cc: bpf@vger.kernel.org
Subject: Re: [PATCH bpf-next v2 05/13] bpf: Account R2 of register-pair returns in live register analysis
Date: Sat, 8 Aug 2026 09:02:59 -0700	[thread overview]
Message-ID: <1de41ecc-9ff3-42b7-8b1b-f71b233965ac@linux.dev> (raw)
In-Reply-To: <20260804211451.A7F621F000E9@smtp.kernel.org>



On 8/4/26 2:14 PM, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
> - [High] The verifier fails to check if BPF_REG_2 is initialized at BPF_EXIT for global subprograms returning > 8 bytes, which can lead to leaking uninitialized memory.
> - [High] The verifier fails to copy the callee's R2 to the caller's R2 in prepare_func_exit() for static subprograms returning > 8 bytes.
> --
>
> --- Patch [5]: [PATCH bpf-next v2 05/13] bpf: Account R2 of register-pair returns in live register analysis ---
> commit 149c9afee6775ff575a63e08693b340337d96491
> Author: Yonghong Song <yonghong.song@linux.dev>
>
> bpf: Account R2 of register-pair returns in live register analysis
>
> This commit updates the live register analysis in the BPF verifier to mark R2
> as read at BPF_EXIT for subprograms returning a value larger than 8 bytes. It
> uses bpf_ret_reg_pair() to determine if a subprogram returns its value in the
> R0:R2 register pair.
>
>> diff --git a/kernel/bpf/liveness.c b/kernel/bpf/liveness.c
>> index 0aadfbae0acc5..68df6d8db4bda 100644
>> --- a/kernel/bpf/liveness.c
>> +++ b/kernel/bpf/liveness.c
> [ ... ]
>> @@ -2174,7 +2179,7 @@ static void compute_insn_live_regs(struct bpf_verifier_env *env,
>>   			break;
>>   		case BPF_EXIT:
>>   			def = 0;
>> -			use = r0;
>> +			use = ret_reg_pair ? (r0 | BIT(BPF_REG_2)) : r0;
> [Severity: High]
> Does check_global_subprog_return_code() also need to check BPF_REG_2 when the
> subprogram returns a register pair?
>
> If a global BPF subprogram returns a 16-byte value (e.g., an __int128 or
> struct) but does not write to R2 before exiting, the verifier only validates
> that BPF_REG_0 is initialized:
>
> kernel/bpf/verifier.c:check_global_subprog_return_code() {
>      ...
> 	return check_global_ret_scalar_reg(env, BPF_REG_0);
> }
>
> Although check_global_ret_scalar_reg() was refactored earlier in this series
> so that it can be reused for R2, there appears to be no call added to check R2
> in check_global_subprog_return_code().
>
> Can this allow a global subprogram to leak uninitialized kernel memory or
> pointers in the CPU register corresponding to R2 back to the kernel caller?
>
> [Severity: High]
> Additionally, should prepare_func_exit() copy the callee's R2 to the caller's
> R2 for static subprograms returning > 8 bytes?
>
> Currently, prepare_func_exit() only copies R0:
>
> kernel/bpf/verifier.c:prepare_func_exit() {
>      ...
> 	} else {
> 		/* return to the caller whatever r0 had in the callee */
> 		caller->regs[BPF_REG_0] = *r0;
> 	}
>      ...
> }
>
> If a BPF program calls a static subprogram that returns a 16-byte value, and
> the caller attempts to use the upper 8 bytes returned in R2, won't the verifier
> reject the valid program with a read of uninitialized register error?
>
> This happens because the caller's R2 was marked NOT_INIT prior to the call by
> clear_caller_saved_regs(), but prepare_func_exit() does not propagate the
> callee's R2 value back to the caller.

We should be okay here. The actually allowing R2 is in later commit
  Add verifier support for 16-byte returns in R0:R2

>
>>   			break;
>>   		case BPF_CALL:
>>   			def = ALL_CALLER_SAVED_REGS;


  reply	other threads:[~2026-08-08 16:03 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-04 20:35 [PATCH v2 00/13] bpf: Support aggregate return values up to 16 bytes Yonghong Song
2026-08-04 20:35 ` [PATCH bpf-next v2 01/13] bpf: Factor check_global_ret_scalar_reg() out of the global return check Yonghong Song
2026-08-04 20:35 ` [PATCH bpf-next v2 02/13] bpf: Add helpers to describe the R0:R2 return register pair Yonghong Song
2026-08-04 20:35 ` [PATCH bpf-next v2 03/13] bpf: Wire up JIT support for 16-byte kfunc returns Yonghong Song
2026-08-04 20:35 ` [PATCH bpf-next v2 04/13] bpf: Track R2 of register-pair returns in precision backtracking Yonghong Song
2026-08-04 20:35 ` [PATCH bpf-next v2 05/13] bpf: Account R2 of register-pair returns in live register analysis Yonghong Song
2026-08-04 21:14   ` sashiko-bot
2026-08-08 16:02     ` Yonghong Song [this message]
2026-08-04 20:35 ` [PATCH bpf-next v2 06/13] bpf: Reject callbacks returning more than 8 bytes Yonghong Song
2026-08-04 21:54   ` bot+bpf-ci
2026-08-08 16:05     ` Yonghong Song
2026-08-04 20:35 ` [PATCH bpf-next v2 07/13] bpf: Add verifier support for 16-byte returns in R0:R2 Yonghong Song
2026-08-04 20:52   ` sashiko-bot
2026-08-08 16:07     ` Yonghong Song
2026-08-04 20:36 ` [PATCH bpf-next v2 08/13] bpf: Reject register-pair returns when the subprog BTF is unreliable Yonghong Song
2026-08-04 20:36 ` [PATCH bpf-next v2 09/13] bpf: Enable aggregate return types up to 16 bytes Yonghong Song
2026-08-04 20:36 ` [PATCH bpf-next v2 10/13] selftests/bpf: Add C tests for 16-byte returns in R0:R2 Yonghong Song
2026-08-04 20:47   ` sashiko-bot
2026-08-08 16:30     ` Yonghong Song
2026-08-04 20:36 ` [PATCH bpf-next v2 11/13] selftests/bpf: Add inline-asm and subprog tests for R0:R2 returns Yonghong Song
2026-08-04 20:52   ` sashiko-bot
2026-08-08 16:35     ` Yonghong Song
2026-08-04 20:36 ` [PATCH bpf-next v2 12/13] selftests/bpf: Add tests for callbacks returning more than 8 bytes Yonghong Song
2026-08-04 20:36 ` [PATCH bpf-next v2 13/13] Documentation/bpf: Document up to 16-byte kfunc return values in R0:R2 Yonghong Song

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=1de41ecc-9ff3-42b7-8b1b-f71b233965ac@linux.dev \
    --to=yonghong.song@linux.dev \
    --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 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.