From: sashiko-bot@kernel.org
To: "Jens Remus" <jremus@linux.ibm.com>
Cc: bpf@vger.kernel.org
Subject: Re: [PATCH v15 10/20] unwind_user/sframe: Remove .sframe section on detected corruption
Date: Wed, 20 May 2026 16:26:19 +0000 [thread overview]
Message-ID: <20260520162619.A7BA41F00893@smtp.kernel.org> (raw)
In-Reply-To: <20260520154004.3845823-11-jremus@linux.ibm.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
New issues:
- [High] Concurrent stack unwinds encountering an invalid .sframe section will trigger a WARN_ON_ONCE, allowing unprivileged users to cause kernel panics.
Pre-existing issues:
- [Critical] A TOCTOU race in sframe_remove_section leads to SRCU callback list corruption and memory leaks.
--
commit db7031336962bd6fc8db7c08a1c00d847ae5869b
Author: Josh Poimboeuf <jpoimboe@kernel.org>
unwind_user/sframe: Remove .sframe section on detected corruption
This commit updates the sframe unwinder to remove an .sframe section
if corruption is detected during the unwind process. It handles access
faults and invalid entries by calling sframe_remove_section() on the
corrupt section.
> diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c
> index f723c1a32f906..02331956009a0 100644
> --- a/kernel/unwind/sframe.c
> +++ b/kernel/unwind/sframe.c
[ ... ]
> @@ -360,16 +360,23 @@ int sframe_find(unsigned long ip, struct unwind_user_frame *frame)
> return -ENOENT;
>
> if (!user_read_access_begin((void __user *)sec->sframe_start,
> - sec->sframe_end - sec->sframe_start))
> - return -EFAULT;
> + sec->sframe_end - sec->sframe_start)) {
> + ret = -EFAULT;
> + goto end;
> + }
>
> ret = __find_fde(sec, ip, &fde);
> if (ret)
> - goto end;
> + goto end_uaccess;
>
> ret = __find_fre(sec, &fde, ip, frame);
> -end:
> +end_uaccess:
> user_read_access_end();
> +
> +end:
> + if (ret && ret != -ENOENT)
> + WARN_ON_ONCE(sframe_remove_section(sec->sframe_start));
[Severity: High]
Could this WARN_ON_ONCE be triggered concurrently by unprivileged users?
If multiple threads concurrently encounter an error while unwinding through
an invalid .sframe section, they might both jump to the end label. The
first thread will successfully remove the section and return 0. Subsequent
threads will fail to find the section since it was already removed, causing
sframe_remove_section() to return -EINVAL.
Since -EINVAL is non-zero, this would unconditionally trigger the
WARN_ON_ONCE. If panic_on_warn is enabled, could this allow a malformed
section to intentionally crash the system?
[Severity: Critical]
This is a pre-existing issue, but does sframe_remove_section() have a race
condition that can corrupt the srcu callback list?
Looking at sframe_remove_section(), it locklessly iterates mm->sframe_mt
using mt_for_each() to find the section pointer:
kernel/unwind/sframe.c:sframe_remove_section() {
...
mt_for_each(&mm->sframe_mt, sec, index, ULONG_MAX) {
if (sec->sframe_start == sframe_start) {
found = true;
ret |= __sframe_remove_section(mm, sec);
}
}
...
}
If a concurrent thread erases the original section and inserts a new one
at the same text_start, mtree_erase() inside __sframe_remove_section()
would remove the new section. The code would then unconditionally call
call_srcu() with the old sec pointer.
Because the old section is already pending in the srcu callback list,
would double-queuing it corrupt the list and permanently leak the newly
erased section?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260520154004.3845823-1-jremus@linux.ibm.com?part=10
next prev parent reply other threads:[~2026-05-20 16:26 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-20 15:39 [PATCH v15 00/20] unwind_deferred: Implement sframe handling Jens Remus
2026-05-20 15:39 ` [PATCH v15 01/20] unwind_user: Add generic and arch-specific headers to MAINTAINERS Jens Remus
2026-05-20 15:39 ` [PATCH v15 02/20] unwind_user/sframe: Add support for reading .sframe headers Jens Remus
2026-05-20 16:02 ` sashiko-bot
2026-05-21 7:58 ` Jens Remus
2026-05-20 15:39 ` [PATCH v15 03/20] unwind_user/sframe: Store .sframe section data in per-mm maple tree Jens Remus
2026-05-20 16:29 ` sashiko-bot
2026-05-21 9:39 ` Jens Remus
2026-05-21 16:08 ` Steven Rostedt
2026-05-20 15:39 ` [PATCH v15 04/20] x86/uaccess: Add unsafe_copy_from_user() implementation Jens Remus
2026-05-20 16:13 ` sashiko-bot
2026-05-20 15:39 ` [PATCH v15 05/20] unwind_user/sframe: Add support for reading .sframe contents Jens Remus
2026-05-20 16:33 ` sashiko-bot
2026-05-21 9:40 ` Jens Remus
2026-05-20 15:39 ` [PATCH v15 06/20] unwind_user/sframe: Detect .sframe sections in executables Jens Remus
2026-05-20 15:39 ` [PATCH v15 07/20] unwind_user/sframe: Wire up unwind_user to sframe Jens Remus
2026-05-20 16:23 ` sashiko-bot
2026-05-21 10:44 ` Jens Remus
2026-05-20 15:39 ` [PATCH v15 08/20] unwind_user: Stop when reaching an outermost frame Jens Remus
2026-05-20 16:01 ` sashiko-bot
2026-05-21 10:45 ` Jens Remus
2026-05-20 15:39 ` [PATCH v15 09/20] unwind_user/sframe: Add support for outermost frame indication Jens Remus
2026-05-20 16:01 ` sashiko-bot
2026-05-21 10:46 ` Jens Remus
2026-05-20 15:39 ` [PATCH v15 10/20] unwind_user/sframe: Remove .sframe section on detected corruption Jens Remus
2026-05-20 16:26 ` sashiko-bot [this message]
2026-05-20 15:39 ` [PATCH v15 11/20] unwind_user/sframe: Show file name in debug output Jens Remus
2026-05-20 16:14 ` sashiko-bot
2026-05-21 10:55 ` Jens Remus
2026-05-21 16:20 ` Steven Rostedt
2026-05-20 15:39 ` [PATCH v15 12/20] unwind_user/sframe: Add .sframe validation option Jens Remus
2026-05-20 16:15 ` sashiko-bot
2026-05-21 12:51 ` Jens Remus
2026-05-20 15:39 ` [PATCH v15 13/20] unwind_user: Enable archs that pass RA in a register Jens Remus
2026-05-20 16:21 ` sashiko-bot
2026-05-21 13:00 ` Jens Remus
2026-05-20 15:39 ` [PATCH v15 14/20] unwind_user: Flexible FP/RA recovery rules Jens Remus
2026-05-20 15:39 ` [PATCH v15 15/20] unwind_user: Flexible CFA " Jens Remus
2026-05-20 16:22 ` sashiko-bot
2026-05-21 11:33 ` Jens Remus
2026-05-20 15:40 ` [PATCH v15 16/20] unwind_user/sframe: Add support for SFrame V3 flexible FDEs Jens Remus
2026-05-20 17:04 ` sashiko-bot
2026-05-21 11:58 ` Jens Remus
2026-05-20 15:40 ` [PATCH v15 17/20] unwind_user/sframe: Separate reading of FRE from reading of FRE data words Jens Remus
2026-05-20 16:48 ` sashiko-bot
2026-05-20 15:40 ` [PATCH v15 18/20] unwind_user/sframe: Duplicate registered .sframe section data on clone/fork Jens Remus
2026-05-20 17:01 ` sashiko-bot
2026-05-21 12:05 ` Jens Remus
2026-05-20 15:40 ` [PATCH v15 19/20] unwind_user/sframe/x86: Enable sframe unwinding on x86 Jens Remus
2026-05-20 15:40 ` [PATCH v15 20/20] unwind_user/sframe: Add prctl() interface for registering .sframe sections Jens Remus
2026-05-20 16:52 ` sashiko-bot
2026-05-21 12:08 ` Jens Remus
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=20260520162619.A7BA41F00893@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=jremus@linux.ibm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox