From: sashiko-bot@kernel.org
To: "Saket Kumar Bhaskar" <skb99@linux.ibm.com>
Cc: bpf@vger.kernel.org
Subject: Re: [PATCH v12 1/8] powerpc/bpf: fix buffer overflow in JIT for large BPF programs
Date: Tue, 18 Aug 2026 05:00:56 +0000 [thread overview]
Message-ID: <20260818050056.AC1811F000E9@smtp.kernel.org> (raw)
In-Reply-To: <191961a8100f3656a01ab826a02d43c765d02464.1787027080.git.skb99@linux.ibm.com>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Pre-existing issues:
- [High] bpf_jit_binary_pack_finalize leaks modmem charge and uses uninitialized size on error path.
--
--- Patch [1]: [PATCH v12 1/8] powerpc/bpf: fix buffer overflow in JIT for large BPF programs ---
commit 86d46c787bf7b94485f88f3d4dc3220927360140
Author: Abhishek Dubey <adubey@linux.ibm.com>
powerpc/bpf: fix buffer overflow in JIT for large BPF programs
This patch fixes a buffer overflow in the PowerPC BPF JIT compiler
caused by incorrect handling of exit_addr during pass-0 size calculation.
It ensures the epilogue instructions are conservatively accounted for
in the initial allocation and iterates the code-generation loop until
the program size converges.
Link: https://lore.kernel.org/bpf/20260529015855.364704-2-adubey@linux.ibm.com/T/#mfcb23909d977b949727cca4f59ee56a13fd69b92
> diff --git a/arch/powerpc/net/bpf_jit_comp.c b/arch/powerpc/net/bpf_jit_comp.c
> index 7b07b43575f11..8bee2674d4a90 100644
> --- a/arch/powerpc/net/bpf_jit_comp.c
> +++ b/arch/powerpc/net/bpf_jit_comp.c
[ ... ]
> @@ -306,10 +306,13 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_verifier_env *env, struct bpf_pr
> code_base = (u32 *)(image + FUNCTION_DESCR_SIZE);
> fcode_base = (u32 *)(fimage + FUNCTION_DESCR_SIZE);
>
> - /* Code generation passes 1-2 */
> - for (pass = 1; pass < 3; pass++) {
> + /* Code generation passes 1-2+, loop until program size converges. */
> + for (pass = 1; pass <= CODEGEN_MAX_PASSES; pass++) {
> + u32 prev_proglen = proglen;
> +
> /* Now build the prologue, body code & epilogue for real. */
> cgctx.idx = 0;
> + cgctx.exentry_idx = 0;
> cgctx.alt_exit_addr = 0;
> bpf_jit_build_prologue(code_base, &cgctx);
> if (bpf_jit_build_body(fp, code_base, fcode_base, &cgctx, addrs, pass,
> @@ -318,11 +321,26 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_verifier_env *env, struct bpf_pr
> bpf_jit_binary_pack_free(fhdr, hdr);
> goto out_err;
> }
> + addrs[fp->len] = cgctx.idx * 4;
> bpf_jit_build_epilogue(code_base, &cgctx);
>
> + proglen = cgctx.idx * 4;
> +
> if (bpf_jit_enable > 1)
> pr_info("Pass %d: shrink = %d, seen = 0x%x\n", pass,
> - proglen - (cgctx.idx * 4), cgctx.seen);
> + prev_proglen - proglen, cgctx.seen);
> +
> + /* Check if program size has converged, but ensure minimum passes */
> + if (pass >= CODEGEN_MIN_PASSES && proglen == prev_proglen)
> + break;
> +
> + if (pass == CODEGEN_MAX_PASSES && proglen != prev_proglen) {
> + pr_err("BPF JIT: Program did not converge after %d passes\n",
> + CODEGEN_MAX_PASSES);
> + bpf_arch_text_copy(&fhdr->size, &hdr->size, sizeof(hdr->size));
> + bpf_jit_binary_pack_free(fhdr, hdr);
> + goto out_err;
> + }
[Severity: High]
This isn't a bug introduced by this patch, but since we are touching the JIT
error paths here, I noticed a potential leak in bpf_jit_binary_pack_finalize().
Does the error path in kernel/bpf/core.c:bpf_jit_binary_pack_finalize() leak
the global JIT memory charge?
When bpf_arch_text_copy() fails, the error path cleans up the memory
allocations but appears to completely omit the corresponding
bpf_jit_uncharge_modmem() call:
kernel/bpf/core.c:bpf_jit_binary_pack_finalize() {
...
kvfree(rw_header);
if (IS_ERR(ptr)) {
bpf_prog_pack_free(ro_header, ro_header->size);
return PTR_ERR(ptr);
}
...
}
Additionally, could ro_header->size be uninitialized if bpf_arch_text_copy()
fails early, potentially causing bpf_prog_pack_free() to corrupt the
pack bitmap?
> }
--
Sashiko AI review · https://sashiko.dev/#/patchset/cover.1787027080.git.skb99@linux.ibm.com?part=1
next prev parent reply other threads:[~2026-08-18 5:00 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <cover.1787027080.git.skb99@linux.ibm.com>
2026-08-18 4:43 ` [PATCH v12 1/8] powerpc/bpf: fix buffer overflow in JIT for large BPF programs Saket Kumar Bhaskar
2026-08-18 5:00 ` sashiko-bot [this message]
2026-08-18 4:43 ` [PATCH v12 2/8] powerpc/bpf: fix alignment of long branch trampoline address Saket Kumar Bhaskar
2026-08-18 5:45 ` bot+bpf-ci
2026-08-18 4:43 ` [PATCH v12 3/8] powerpc/bpf: Move out dummy_tramp_addr after Long branch stub Saket Kumar Bhaskar
2026-08-18 5:32 ` bot+bpf-ci
2026-08-18 4:43 ` [PATCH v12 4/8] powerpc64/bpf: fix compare instruction emitted for tailcall Saket Kumar Bhaskar
2026-08-18 4:43 ` [PATCH v12 5/8] powerpc64/bpf: fix percpu private stack leak on JIT failure Saket Kumar Bhaskar
2026-08-18 4:56 ` sashiko-bot
2026-08-18 4:43 ` [PATCH v12 6/8] selftests/bpf: Fixing powerpc JIT disassembly failure Saket Kumar Bhaskar
2026-08-18 5:32 ` bot+bpf-ci
2026-08-18 4:43 ` [PATCH v12 7/8] selftests/bpf: Enable verifier selftest for powerpc64 Saket Kumar Bhaskar
2026-08-18 4:43 ` [PATCH v12 8/8] selftests/bpf: Add tailcall " Saket Kumar Bhaskar
2026-08-18 5:32 ` 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=20260818050056.AC1811F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=skb99@linux.ibm.com \
/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