Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

powerpc/uaccess: Use unsafe wrappers for ASM GOTO

ASM GOTO is miscompiled by GCC when it is used inside a auto cleanup scope:

bool foo(u32 __user *p, u32 val)
{
scoped_guard(pagefault)
unsafe_put_user(val, p, efault);
return true;
efault:
return false;
}

It ends up leaking the pagefault disable counter in the fault path. clang
at least fails the build.

Rename unsafe_*_user() to arch_unsafe_*_user() which makes the generic
uaccess header wrap it with a local label that makes both compilers emit
correct code. Same for the kernel_nofault() variants.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Link: https://patch.msgid.link/20251027083745.356628509@linutronix.de

authored by

Thomas Gleixner and committed by
Peter Zijlstra
5002dd53 14219398

+4 -4
+4 -4
arch/powerpc/include/asm/uaccess.h
··· 451 451 #define user_write_access_begin user_write_access_begin 452 452 #define user_write_access_end prevent_current_write_to_user 453 453 454 - #define unsafe_get_user(x, p, e) do { \ 454 + #define arch_unsafe_get_user(x, p, e) do { \ 455 455 __long_type(*(p)) __gu_val; \ 456 456 __typeof__(*(p)) __user *__gu_addr = (p); \ 457 457 \ ··· 459 459 (x) = (__typeof__(*(p)))__gu_val; \ 460 460 } while (0) 461 461 462 - #define unsafe_put_user(x, p, e) \ 462 + #define arch_unsafe_put_user(x, p, e) \ 463 463 __put_user_size_goto((__typeof__(*(p)))(x), (p), sizeof(*(p)), e) 464 464 465 465 #define unsafe_copy_from_user(d, s, l, e) \ ··· 504 504 unsafe_put_user(*(u8*)(_src + _i), (u8 __user *)(_dst + _i), e); \ 505 505 } while (0) 506 506 507 - #define __get_kernel_nofault(dst, src, type, err_label) \ 507 + #define arch_get_kernel_nofault(dst, src, type, err_label) \ 508 508 __get_user_size_goto(*((type *)(dst)), \ 509 509 (__force type __user *)(src), sizeof(type), err_label) 510 510 511 - #define __put_kernel_nofault(dst, src, type, err_label) \ 511 + #define arch_put_kernel_nofault(dst, src, type, err_label) \ 512 512 __put_user_size_goto(*((type *)(src)), \ 513 513 (__force type __user *)(dst), sizeof(type), err_label) 514 514