Skip to content

Commit 1421939

Browse files
KAGA-KOKOPeter Zijlstra
authored andcommitted
x86/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.294359925@linutronix.de
1 parent 3eb6660 commit 1421939

1 file changed

Lines changed: 6 additions & 6 deletions

File tree

arch/x86/include/asm/uaccess.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -528,18 +528,18 @@ static __must_check __always_inline bool user_access_begin(const void __user *pt
528528
#define user_access_save() smap_save()
529529
#define user_access_restore(x) smap_restore(x)
530530

531-
#define unsafe_put_user(x, ptr, label) \
531+
#define arch_unsafe_put_user(x, ptr, label) \
532532
__put_user_size((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr)), label)
533533

534534
#ifdef CONFIG_CC_HAS_ASM_GOTO_OUTPUT
535-
#define unsafe_get_user(x, ptr, err_label) \
535+
#define arch_unsafe_get_user(x, ptr, err_label) \
536536
do { \
537537
__inttype(*(ptr)) __gu_val; \
538538
__get_user_size(__gu_val, (ptr), sizeof(*(ptr)), err_label); \
539539
(x) = (__force __typeof__(*(ptr)))__gu_val; \
540540
} while (0)
541541
#else // !CONFIG_CC_HAS_ASM_GOTO_OUTPUT
542-
#define unsafe_get_user(x, ptr, err_label) \
542+
#define arch_unsafe_get_user(x, ptr, err_label) \
543543
do { \
544544
int __gu_err; \
545545
__inttype(*(ptr)) __gu_val; \
@@ -618,11 +618,11 @@ do { \
618618
} while (0)
619619

620620
#ifdef CONFIG_CC_HAS_ASM_GOTO_OUTPUT
621-
#define __get_kernel_nofault(dst, src, type, err_label) \
621+
#define arch_get_kernel_nofault(dst, src, type, err_label) \
622622
__get_user_size(*((type *)(dst)), (__force type __user *)(src), \
623623
sizeof(type), err_label)
624624
#else // !CONFIG_CC_HAS_ASM_GOTO_OUTPUT
625-
#define __get_kernel_nofault(dst, src, type, err_label) \
625+
#define arch_get_kernel_nofault(dst, src, type, err_label) \
626626
do { \
627627
int __kr_err; \
628628
\
@@ -633,7 +633,7 @@ do { \
633633
} while (0)
634634
#endif // CONFIG_CC_HAS_ASM_GOTO_OUTPUT
635635

636-
#define __put_kernel_nofault(dst, src, type, err_label) \
636+
#define arch_put_kernel_nofault(dst, src, type, err_label) \
637637
__put_user_size(*((type *)(src)), (__force type __user *)(dst), \
638638
sizeof(type), err_label)
639639

0 commit comments

Comments
 (0)