Re: [RFC PATCH v1 14/25] unwind_user/eh_frame: Add .eh_frame[_hdr] validation option

Jens Remus <[email protected]>
Newsgroups dev.linux.lists.sashiko-reviews,org.kernel.vger.linux-s390,org.kernel.vger.linux-trace-kernel
Organization IBM Deutschland Research & Development GmbH
Message-ID <[email protected]>
On 8/18/2026 5:08 PM, [email protected] wrote:

>> diff --git a/arch/Kconfig b/arch/Kconfig

>> +config EH_FRAME_VALIDATION
>> +	bool "Enable .eh_frame[_hdr] section debugging"
>> +	depends on HAVE_UNWIND_USER_EH_FRAME
>> +	depends on DYNAMIC_DEBUG
>> +	help
>> +	  When adding an .eh_frame_hdr section for a test, validate the
>> +	  entire section and its referenced entrire .eh_frame section
> 
> [Severity: Low]
> Is there a typo here? (entrire -> entire)

Fixed in next version.

> 
>> +	  immediately rather than on demand.
> 
> [ ... ]

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

>> +#ifdef CONFIG_EH_FRAME_VALIDATION
>> +
>> +static int eh_frame_validate_section(struct eh_frame_section *sec)
>> +{
>> +	void __user *table_start_ptr;
>> +	unsigned long table_size;
>> +	u8 table_enc;
>> +	int entry_size;
>> +	unsigned long prev_func_addr;
>> +	unsigned int i;

	unsigned long i;

>> +
>> +	if (!sec->has_binary_search_table)
> 
> [Severity: Low]
> Does this cause a build failure? It appears has_binary_search_table was never
> added to struct eh_frame_section.

That was a rebase error.  Fixed in next version.

> 
>> +		return 0;
>> +
>> +	if (!sec->fde_count) {
>> +		dbg_sec(".eh_frame_hdr: invalid FDE count\n");
>> +		return -EINVAL;
>> +	}
>> +
>> +	table_enc = sec->binary_search_table_enc;
>> +	entry_size = 2 * encoded_pointer_size(table_enc);
>> +	if (!entry_size) {
>> +		dbg_sec(".eh_frame_hdr: invalid binary search table entry size\n");
>> +		return -EINVAL;
>> +	}
>> +	table_start_ptr = (void __user *)sec->binary_search_table_start;
>> +	table_size = sec->binary_search_table_end - sec->binary_search_table_start;
>> +
>> +	for (i = 0; i < sec->fde_count; i++) {
> 
> [Severity: High]
> Can this loop become infinite and cause a hard lockup?
> 
> The loop counter i is a 32-bit unsigned int, while sec->fde_count is a 64-bit
> unsigned long. If sec->fde_count exceeds UINT_MAX, i will wrap around to 0, and
> the condition i < sec->fde_count will always evaluate to true.

My bad!  Fixed in next version.

> 
> [Severity: Medium]
> Additionally, can this unbounded loop over potentially millions of entries
> cause a CPU soft lockup or RCU stall? 
> 
> This loop executes entirely without a cond_resched() call, allowing a local
> user to load a moderately large ELF file and hold the CPU uninterrupted for
> seconds.

IIRC Steven told me not to add cond_resched() in reply to previous
Sashiko AI reviews of the unwind user sframe series.  Won't address
for now.

> 
>> +		struct eh_frame_fde fde;
>> +		unsigned long cur;
>> +		unsigned long func_addr, fde_addr;
>> +		int ret;
>> +
>> +		cur = sec->binary_search_table_start + i * entry_size;
>> +
>> +		scoped_user_read_access_size(table_start_ptr, table_size, Efault) {
>> +			/* Read function start address from table */
>> +			ret = read_encoded_pointer(sec, NULL, &cur,
>> +						   sec->binary_search_table_end,
>> +						   table_enc, &func_addr);
>> +			if (ret) {
>> +				dbg_sec_ehfh(cur, "table[%u]: failed to read function start address\n", i);
> 
> [Severity: High]
> Does calling dbg_sec_ehfh() inside scoped_user_read_access_size violate UACCESS
> rules?
> 
> The macro scoped_user_read_access_size enables UACCESS. dbg_sec_ehfh expands to
> pr_debug, which calls printk. Calling complex or sleepable functions like
> printk with UACCESS enabled can trigger page faults, take locks, or schedule,
> potentially leading to kernel oopses or panics.

This is mentioned in the patch notes.  I am looking for suggestions on
how to emit debug messages from a scoped UACCESS region.  Is the only
option to change to code from the unsafe to the safe versions of the
user access functions?

> 
>> +				return ret;
>> +			}
> 

Thanks and regards,
Jens
-- 
Jens Remus
Linux on Z Development (D3303)
[email protected] / [email protected]

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/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.