All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jens Remus <jremus@linux.ibm.com>
To: sashiko-reviews@lists.linux.dev, Steven Rostedt <rostedt@goodmis.org>
Cc: Alexander Gordeev <agordeev@linux.ibm.com>,
	Heiko Carstens <hca@linux.ibm.com>,
	Vasily Gorbik <gor@linux.ibm.com>,
	Christian Borntraeger <borntraeger@linux.ibm.com>,
	linux-s390@vger.kernel.org, linux-trace-kernel@vger.kernel.org
Subject: Re: [RFC PATCH v1 25/25] unwind_user/eh_frame: Add prctl() interface for (un)registering .eh_frame_hdr sections
Date: Fri, 21 Aug 2026 21:41:53 +0200	[thread overview]
Message-ID: <bf5c2515-d908-4b08-8ae8-45c1502df3de@linux.ibm.com> (raw)
In-Reply-To: <20260818151727.1D4C51F000E9@smtp.kernel.org>

On 8/18/2026 5:17 PM, sashiko-bot@kernel.org wrote:
> This patch adds two new prctl options to allow dynamic linkers to register
> and unregister .eh_frame_hdr sections with the kernel. It introduces the
> eh_frame_setup structure to pass section bounds from userspace and adds the
> corresponding handlers.

>> diff --git a/kernel/unwind/eh_frame.c b/kernel/unwind/eh_frame.c

>> +int eh_frame_register(struct eh_frame_setup __user *user_data, __kernel_size_t size)
>> +{
>> +	struct eh_frame_setup data;
>> +	unsigned long eh_frame_hdr_end, text_end;
>> +
>> +	if (!user_data && !size)
>> +		return -EINVAL;
>> +
>> +	if (size != sizeof(data))
>> +		return -EINVAL;
> 
> [Severity: Medium]
> Could this strict size check prevent future UAPI extensions from being handled
> properly by older kernels?
> 
> If a newer userspace binary passes a legitimately extended eh_frame_setup
> struct to an older kernel, it looks like it will be rejected with -EINVAL.
> 
> Would it be better to use copy_struct_from_user() here to safely handle
> zero-padded extensions?

Steven, IIRC you got similar review feedback on your stacktrace syscall
and rejected it.  Why wouldn't we copy sizeof(data) and check that any
additional size - sizeof(data) bytes of user data are zero?

> 
>> +
>> +	if (copy_from_user(&data, user_data, sizeof(data)))
>> +		return -EFAULT;
> 
> [ ... ]
> 
>> +int eh_frame_unregister(struct eh_frame_setup __user *user_data, __kernel_size_t size)
>> +{
>> +	struct eh_frame_setup data;
>> +
>> +	if (!user_data && !size)
>> +		return -EINVAL;
>> +
>> +	if (size != sizeof(data))
>> +		return -EINVAL;
> 
> [Severity: Medium]
> As with eh_frame_register(), does this strict size comparison break forward
> compatibility for future struct extensions?

Likewise.

> 
>> +
>> +	if (copy_from_user(&data, user_data, sizeof(data)))
>> +		return -EFAULT;
>> +
>> +	/* Unregister only uses eh_frame_hdr_start */
>> +	if (data.eh_frame_hdr_size || data.text_start || data.text_size)
>> +		return -EINVAL;
>> +
>> +	return eh_frame_remove_section(data.eh_frame_hdr_start);
> 
> [Severity: Medium]
> Does this code silently truncate the 64-bit parameter on 32-bit platforms,
> potentially causing the wrong section to be unregistered?
> 
> The data.eh_frame_hdr_start parameter is a __u64, but it is passed directly
> into eh_frame_remove_section() which takes an unsigned long. If userspace
> provides an out-of-bounds 64-bit value on a 32-bit system, it appears it
> would be implicitly truncated to a valid 32-bit address rather than being
> rejected.

Steven, do you have any suggestion?

> 
> Looking at the underlying implementation of eh_frame_remove_section() that is
> exposed by this new prctl, is there a race condition in
> __eh_frame_remove_section() that could lead to a double-free?

This should be resolved by the fixes to "[RFC PATCH v1 08/25] unwind_user/
eh_frame: Store .eh_frame_hdr section data in per-mm maple tree".

> 
> kernel/unwind/eh_frame.c:__eh_frame_remove_section() {
>     ...
>     if (!mtree_erase(&mm->eh_frame_mt, sec->text_start)) {
>         dbg_sec("mtree_erase failed: text=%lx\n", sec->text_start);
>         return -EINVAL;
>     }
>     
>     call_srcu(&eh_frame_srcu, &sec->rcu, eh_frame_free_srcu);
>     ...
> }
> 
> [Severity: Critical]
> If a thread unregisters the section and a third thread immediately registers
> a new section at the exact same address, would mtree_erase() erase and return
> the new section instead?
> 
> Because the code evaluates the return value simply as non-NULL, it seems it
> would proceed to call call_srcu() on the old section again, potentially
> causing a double-free and SRCU list corruption.

Likewise fixed in other patch.

> 
> Also, regarding the interaction with the unwinder fast path in eh_frame_find():
> 
> kernel/unwind/eh_frame.c:eh_frame_find() {
>     ...
>     if (ret && (ret != -ENOENT && ret != -EOPNOTSUPP)) {
>         dbg_sec("removing bad .eh_frame[_hdr] section\n");
>         if (eh_frame_remove_section(sec->eh_frame_hdr_start))
>     ...
> }
> 
> [Severity: Critical]
> Can this sequence cause a hard deadlock or NMI-safety violation?
> 
> Stack unwinding is frequently invoked from NMI or IRQ contexts. If
> eh_frame_find() encounters a parsing error, it unconditionally calls
> eh_frame_remove_section(). This attempts to acquire the mtree_lock spinlock
> and invokes call_srcu(), both of which are forbidden in NMI/IRQ contexts.

Deferred unwinding of user space does not run in NMI/IRQ context.

Thanks and regards,
Jens
-- 
Jens Remus
Linux on Z Development (D3303)
jremus@de.ibm.com / jremus@linux.ibm.com

IBM Deutschland Research & Development GmbH; Vorsitzender des Aufsichtsrats: Wolfgang Wendt; Geschäftsführung: David Faller; Sitz der Gesellschaft: Ehningen; Registergericht: Amtsgericht Stuttgart, HRB 243294
IBM Data Privacy Statement: https://www.ibm.com/privacy/


  reply	other threads:[~2026-08-21 19:42 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-18 14:49 [RFC PATCH v1 00/25] unwind_user: Implement .eh_frame handling Jens Remus
2026-08-18 14:49 ` [RFC PATCH v1 01/25] unwind_user: Add generic and arch-specific headers to MAINTAINERS Jens Remus
2026-08-18 14:49 ` [RFC PATCH v1 02/25] unwind_user: Stop when reaching an outermost frame Jens Remus
2026-08-18 14:56   ` sashiko-bot
2026-08-18 14:49 ` [RFC PATCH v1 03/25] unwind_user: Enable archs that pass RA in a register Jens Remus
2026-08-18 14:58   ` sashiko-bot
2026-08-18 14:49 ` [RFC PATCH v1 04/25] unwind_user: Flexible FP/RA recovery rules Jens Remus
2026-08-18 14:58   ` sashiko-bot
2026-08-18 14:49 ` [RFC PATCH v1 05/25] unwind_user: Flexible CFA " Jens Remus
2026-08-18 14:57   ` sashiko-bot
2026-08-18 14:49 ` [RFC PATCH v1 06/25] unwind_user: Enable archs that define CFA = SP_callsite + offset Jens Remus
2026-08-18 14:57   ` sashiko-bot
2026-08-18 14:49 ` [RFC PATCH v1 07/25] unwind_user/eh_frame: Add support for reading .eh_frame_hdr section Jens Remus
2026-08-18 15:02   ` sashiko-bot
2026-08-21 19:41     ` Jens Remus
2026-08-18 14:49 ` [RFC PATCH v1 08/25] unwind_user/eh_frame: Store .eh_frame_hdr section data in per-mm maple tree Jens Remus
2026-08-18 15:08   ` sashiko-bot
2026-08-21 19:41     ` Jens Remus
2026-08-18 14:49 ` [RFC PATCH v1 09/25] unwind_user/eh_frame: Add support for reading .eh_frame section Jens Remus
2026-08-18 15:05   ` sashiko-bot
2026-08-21 19:41     ` Jens Remus
2026-08-18 14:49 ` [RFC PATCH v1 10/25] unwind_user/eh_frame: Detect .eh_frame_hdr sections in executables Jens Remus
2026-08-18 15:18   ` sashiko-bot
2026-08-21 19:41     ` Jens Remus
2026-08-18 14:49 ` [RFC PATCH v1 11/25] unwind_user/eh_frame: Wire up unwind_user to eh_frame Jens Remus
2026-08-18 15:09   ` sashiko-bot
2026-08-21 19:41     ` Jens Remus
2026-08-18 14:49 ` [RFC PATCH v1 12/25] unwind_user/eh_frame: Remove .eh_frame[_hdr] section on detected corruption Jens Remus
2026-08-18 15:10   ` sashiko-bot
2026-08-21 19:41     ` Jens Remus
2026-08-18 14:49 ` [RFC PATCH v1 13/25] unwind_user/eh_frame: Show file name in debug output Jens Remus
2026-08-18 15:00   ` sashiko-bot
2026-08-18 14:49 ` [RFC PATCH v1 14/25] unwind_user/eh_frame: Add .eh_frame[_hdr] validation option Jens Remus
2026-08-18 15:08   ` sashiko-bot
2026-08-21 19:41     ` Jens Remus
2026-08-18 14:49 ` [RFC PATCH v1 15/25] unwind_user/eh_frame: Duplicate registered .eh_frame[_hdr] section data on clone/fork Jens Remus
2026-08-18 15:11   ` sashiko-bot
2026-08-21 19:41     ` Jens Remus
2026-08-18 14:49 ` [RFC PATCH v1 16/25] unwind_user/eh_frame: Add linear .eh_frame search fallback Jens Remus
2026-08-18 15:06   ` sashiko-bot
2026-08-21 19:41     ` Jens Remus
2026-08-18 14:49 ` [RFC PATCH v1 17/25] unwind_user/eh_frame: Ignore DW_CFA_GNU_args_size Jens Remus
2026-08-18 15:04   ` sashiko-bot
2026-08-21 19:41     ` Jens Remus
2026-08-18 14:49 ` [RFC PATCH v1 18/25] unwind_user/eh_frame: Add support for DWARF expressions Jens Remus
2026-08-18 15:13   ` sashiko-bot
2026-08-21 19:41     ` Jens Remus
2026-08-18 14:49 ` [RFC PATCH v1 19/25] x86/uaccess: Add unsafe_copy_from_user() implementation Jens Remus
2026-08-18 15:08   ` sashiko-bot
2026-08-18 14:49 ` [RFC PATCH v1 20/25] unwind_user/eh_frame/x86: Enable eh_frame unwinding on x86 Jens Remus
2026-08-18 15:04   ` sashiko-bot
2026-08-18 14:49 ` [RFC PATCH v1 21/25] unwind_user/eh_frame/x86: Handle PLT expressions Jens Remus
2026-08-18 15:10   ` sashiko-bot
2026-08-21 19:41     ` Jens Remus
2026-08-18 14:49 ` [RFC PATCH v1 22/25] unwind_user/eh_frame/x86: Handle DRAP expressions Jens Remus
2026-08-18 15:10   ` sashiko-bot
2026-08-21 19:41     ` Jens Remus
2026-08-18 14:49 ` [RFC PATCH v1 23/25] s390/ptrace: Provide frame_pointer() Jens Remus
2026-08-18 15:06   ` sashiko-bot
2026-08-18 14:49 ` [RFC PATCH v1 24/25] unwind_user/eh_frame/s390: Enable eh_frame unwinding on s390 Jens Remus
2026-08-18 15:15   ` sashiko-bot
2026-08-18 14:49 ` [RFC PATCH v1 25/25] unwind_user/eh_frame: Add prctl() interface for (un)registering .eh_frame_hdr sections Jens Remus
2026-08-18 15:17   ` sashiko-bot
2026-08-21 19:41     ` Jens Remus [this message]
2026-08-18 17:21 ` [RFC PATCH v1 00/25] unwind_user: Implement .eh_frame handling Steven Rostedt
2026-08-21 19:51   ` Jens Remus
2026-08-19  8:35 ` 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=bf5c2515-d908-4b08-8ae8-45c1502df3de@linux.ibm.com \
    --to=jremus@linux.ibm.com \
    --cc=agordeev@linux.ibm.com \
    --cc=borntraeger@linux.ibm.com \
    --cc=gor@linux.ibm.com \
    --cc=hca@linux.ibm.com \
    --cc=linux-s390@vger.kernel.org \
    --cc=linux-trace-kernel@vger.kernel.org \
    --cc=rostedt@goodmis.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.