Re: [PATCH] powerpc/ptrace: Add offsetof check for exit_flags in pt_regs_check()

"Christophe Leroy (CS GROUP)" <[email protected]>
Newsgroups org.ozlabs.lists.linuxppc-dev,org.kernel.vger.linux-kernel
Message-ID <[email protected]>

Le 03/07/2026 à 10:55, Amit Machhiwal a écrit :
> On 2026/07/03 01:19 PM, Mukesh Kumar Chaurasiya (IBM) wrote:
>> pt_regs_check() verifies that fields shared between struct pt_regs and
>> struct user_pt_regs sit at the same offset, to catch any accidental
>> layout divergence between the kernel and uapi structures.
>>
>> Add the missing check for exit_flags, following the same pattern as the
>> existing checks for result, dsisr, dar and the other shared fields.
>>
>> Fixes: d7a6797e0bc1 ("powerpc: add exit_flags field in pt_regs")

This commit was almost reverted by commit 263e5159e00a ("powerpc: Fix 
exit_flags field placement in pt_regs for ptrace")

Dropping this patch.

Christophe

> 
> You may want to add below in order to get this patch backported:
> 
>    Cc: [email protected]
> 
>> Signed-off-by: Mukesh Kumar Chaurasiya (IBM) <[email protected]>
>> ---
>>   arch/powerpc/kernel/ptrace/ptrace.c | 2 ++
>>   1 file changed, 2 insertions(+)
>>
>> diff --git a/arch/powerpc/kernel/ptrace/ptrace.c b/arch/powerpc/kernel/ptrace/ptrace.c
>> index 316d4f5ead8e..fb3fec73f66a 100644
>> --- a/arch/powerpc/kernel/ptrace/ptrace.c
>> +++ b/arch/powerpc/kernel/ptrace/ptrace.c
>> @@ -235,6 +235,8 @@ void __init pt_regs_check(void)
>>   		     offsetof(struct user_pt_regs, dsisr));
>>   	BUILD_BUG_ON(offsetof(struct pt_regs, result) !=
>>   		     offsetof(struct user_pt_regs, result));
>> +	BUILD_BUG_ON(offsetof(struct pt_regs, exit_flags) !=
>> +		     offsetof(struct user_pt_regs, exit_flags));
> 
> At first, it appeared to be redundant as we already check
> 
> 	CHECK_REG(PT_EXIT_FLAGS, exit_flags);
> 
> which expands to:
> 
> 	#define CHECK_REG(_pt, _reg) \
> 		BUILD_BUG_ON(_pt != (offsetof(struct user_pt_regs, _reg) / \
> 				     sizeof(unsigned long)));
> 
> But looking closely, it turns out to be non-redundant. CHECK_REG only
> touches struct user_pt_regs — it validates the PT_EXIT_FLAGS constant
> against the uapi layout. It says nothing about struct pt_regs.
> 
> struct pt_regs (asm/ptrace.h) embeds struct user_pt_regs in a union
> alongside an anonymous struct that re-declares all the same fields with
> kernel-internal aliases (dear/dar, esr/dsisr). exit_flags lives in that
> anonymous struct. A field accidentally inserted there between result and
> exit_flags would silently break the union aliasing without CHECK_REG
> catching it. The new BUILD_BUG_ON closes that gap, consistent with how
> result, dar and dsisr are already protected in the same block.
> 
> Looks good to me.
> 
> Reviewed-by: Amit Machhiwal <[email protected]>
> 
> Thanks,
> Amit
> 
>>   
>>   	BUILD_BUG_ON(sizeof(struct user_pt_regs) > sizeof(struct pt_regs));
>>   
>> -- 
>> 2.55.0
>>
>>
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.