Merge branch 'uaccess.futex' of git://git.kernel.org/pub/scm/linux/kernel/git/viro...
authorThomas Gleixner <tglx@linutronix.de>
Sat, 28 Mar 2020 10:59:24 +0000 (11:59 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Sat, 28 Mar 2020 10:59:24 +0000 (11:59 +0100)
Pull uaccess futex cleanups for Al Viro:

     Consolidate access_ok() usage and the futex uaccess function zoo.

22 files changed:
arch/alpha/include/asm/futex.h
arch/arc/include/asm/futex.h
arch/arm/include/asm/futex.h
arch/arm64/include/asm/futex.h
arch/hexagon/include/asm/futex.h
arch/ia64/include/asm/futex.h
arch/microblaze/include/asm/futex.h
arch/mips/include/asm/futex.h
arch/nds32/include/asm/futex.h
arch/openrisc/include/asm/futex.h
arch/parisc/include/asm/futex.h
arch/powerpc/include/asm/futex.h
arch/riscv/include/asm/futex.h
arch/s390/include/asm/futex.h
arch/sh/include/asm/futex.h
arch/sparc/include/asm/futex_64.h
arch/x86/include/asm/futex.h
arch/x86/include/asm/uaccess.h
arch/xtensa/include/asm/futex.h
include/asm-generic/futex.h
kernel/futex.c
tools/objtool/check.c

index bfd3c01..da67afd 100644 (file)
@@ -31,7 +31,8 @@ static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval,
 {
        int oldval = 0, ret;
 
-       pagefault_disable();
+       if (!access_ok(uaddr, sizeof(u32)))
+               return -EFAULT;
 
        switch (op) {
        case FUTEX_OP_SET:
@@ -53,8 +54,6 @@ static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval,
                ret = -ENOSYS;
        }
 
-       pagefault_enable();
-
        if (!ret)
                *oval = oldval;
 
index 9d0d070..607d1c1 100644 (file)
@@ -75,10 +75,12 @@ static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval,
 {
        int oldval = 0, ret;
 
+       if (!access_ok(uaddr, sizeof(u32)))
+               return -EFAULT;
+
 #ifndef CONFIG_ARC_HAS_LLSC
        preempt_disable();      /* to guarantee atomic r-m-w of futex op */
 #endif
-       pagefault_disable();
 
        switch (op) {
        case FUTEX_OP_SET:
@@ -101,7 +103,6 @@ static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval,
                ret = -ENOSYS;
        }
 
-       pagefault_enable();
 #ifndef CONFIG_ARC_HAS_LLSC
        preempt_enable();
 #endif
index 83c391b..e133da3 100644 (file)
@@ -134,10 +134,12 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
 {
        int oldval = 0, ret, tmp;
 
+       if (!access_ok(uaddr, sizeof(u32)))
+               return -EFAULT;
+
 #ifndef CONFIG_SMP
        preempt_disable();
 #endif
-       pagefault_disable();
 
        switch (op) {
        case FUTEX_OP_SET:
@@ -159,7 +161,6 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
                ret = -ENOSYS;
        }
 
-       pagefault_enable();
 #ifndef CONFIG_SMP
        preempt_enable();
 #endif
index 6cc26a1..97f6a63 100644 (file)
@@ -48,7 +48,8 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *_uaddr)
        int oldval = 0, ret, tmp;
        u32 __user *uaddr = __uaccess_mask_ptr(_uaddr);
 
-       pagefault_disable();
+       if (!access_ok(_uaddr, sizeof(u32)))
+               return -EFAULT;
 
        switch (op) {
        case FUTEX_OP_SET:
@@ -75,8 +76,6 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *_uaddr)
                ret = -ENOSYS;
        }
 
-       pagefault_enable();
-
        if (!ret)
                *oval = oldval;
 
index 0191f7c..6b9c554 100644 (file)
@@ -36,7 +36,8 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
 {
        int oldval = 0, ret;
 
-       pagefault_disable();
+       if (!access_ok(uaddr, sizeof(u32)))
+               return -EFAULT;
 
        switch (op) {
        case FUTEX_OP_SET:
@@ -62,8 +63,6 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
                ret = -ENOSYS;
        }
 
-       pagefault_enable();
-
        if (!ret)
                *oval = oldval;
 
index 2e106d4..1db26b4 100644 (file)
@@ -50,7 +50,8 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
 {
        int oldval = 0, ret;
 
-       pagefault_disable();
+       if (!access_ok(uaddr, sizeof(u32)))
+               return -EFAULT;
 
        switch (op) {
        case FUTEX_OP_SET:
@@ -74,8 +75,6 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
                ret = -ENOSYS;
        }
 
-       pagefault_enable();
-
        if (!ret)
                *oval = oldval;
 
index 8c90357..86131ed 100644 (file)
@@ -34,7 +34,8 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
 {
        int oldval = 0, ret;
 
-       pagefault_disable();
+       if (!access_ok(uaddr, sizeof(u32)))
+               return -EFAULT;
 
        switch (op) {
        case FUTEX_OP_SET:
@@ -56,8 +57,6 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
                ret = -ENOSYS;
        }
 
-       pagefault_enable();
-
        if (!ret)
                *oval = oldval;
 
index 1102207..2bf8f60 100644 (file)
@@ -89,7 +89,8 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
 {
        int oldval = 0, ret;
 
-       pagefault_disable();
+       if (!access_ok(uaddr, sizeof(u32)))
+               return -EFAULT;
 
        switch (op) {
        case FUTEX_OP_SET:
@@ -116,8 +117,6 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
                ret = -ENOSYS;
        }
 
-       pagefault_enable();
-
        if (!ret)
                *oval = oldval;
 
index 5213c65..4223f47 100644 (file)
@@ -66,8 +66,8 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
 {
        int oldval = 0, ret;
 
-
-       pagefault_disable();
+       if (!access_ok(uaddr, sizeof(u32)))
+               return -EFAULT;
        switch (op) {
        case FUTEX_OP_SET:
                __futex_atomic_op("move %0, %3", ret, oldval, tmp, uaddr,
@@ -93,8 +93,6 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
                ret = -ENOSYS;
        }
 
-       pagefault_enable();
-
        if (!ret)
                *oval = oldval;
 
index fe894e6..865e9cd 100644 (file)
@@ -35,7 +35,8 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
 {
        int oldval = 0, ret;
 
-       pagefault_disable();
+       if (!access_ok(uaddr, sizeof(u32)))
+               return -EFAULT;
 
        switch (op) {
        case FUTEX_OP_SET:
@@ -57,8 +58,6 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
                ret = -ENOSYS;
        }
 
-       pagefault_enable();
-
        if (!ret)
                *oval = oldval;
 
index d2c3e41..c459f65 100644 (file)
@@ -40,7 +40,6 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
        u32 tmp;
 
        _futex_spin_lock_irqsave(uaddr, &flags);
-       pagefault_disable();
 
        ret = -EFAULT;
        if (unlikely(get_user(oldval, uaddr) != 0))
@@ -73,7 +72,6 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
                ret = -EFAULT;
 
 out_pagefault_enable:
-       pagefault_enable();
        _futex_spin_unlock_irqrestore(uaddr, &flags);
 
        if (!ret)
index bc7d9d0..f187bb5 100644 (file)
@@ -35,8 +35,9 @@ static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval,
 {
        int oldval = 0, ret;
 
+       if (!access_ok(uaddr, sizeof(u32)))
+               return -EFAULT;
        allow_read_write_user(uaddr, uaddr, sizeof(*uaddr));
-       pagefault_disable();
 
        switch (op) {
        case FUTEX_OP_SET:
@@ -58,8 +59,6 @@ static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval,
                ret = -ENOSYS;
        }
 
-       pagefault_enable();
-
        *oval = oldval;
 
        prevent_read_write_user(uaddr, uaddr, sizeof(*uaddr));
index fdfaf7f..1b00bad 100644 (file)
@@ -46,7 +46,8 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
 {
        int oldval = 0, ret = 0;
 
-       pagefault_disable();
+       if (!access_ok(uaddr, sizeof(u32)))
+               return -EFAULT;
 
        switch (op) {
        case FUTEX_OP_SET:
@@ -73,8 +74,6 @@ arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
                ret = -ENOSYS;
        }
 
-       pagefault_enable();
-
        if (!ret)
                *oval = oldval;
 
index 5e97a43..26f9144 100644 (file)
@@ -29,7 +29,6 @@ static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval,
        mm_segment_t old_fs;
 
        old_fs = enable_sacf_uaccess();
-       pagefault_disable();
        switch (op) {
        case FUTEX_OP_SET:
                __futex_atomic_op("lr %2,%5\n",
@@ -54,7 +53,6 @@ static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval,
        default:
                ret = -ENOSYS;
        }
-       pagefault_enable();
        disable_sacf_uaccess(old_fs);
 
        if (!ret)
index 3190ec8..b39cda0 100644 (file)
@@ -34,8 +34,6 @@ static inline int arch_futex_atomic_op_inuser(int op, u32 oparg, int *oval,
        u32 oldval, newval, prev;
        int ret;
 
-       pagefault_disable();
-
        do {
                ret = get_user(oldval, uaddr);
 
@@ -67,8 +65,6 @@ static inline int arch_futex_atomic_op_inuser(int op, u32 oparg, int *oval,
                ret = futex_atomic_cmpxchg_inatomic(&prev, uaddr, oldval, newval);
        } while (!ret && prev != oldval);
 
-       pagefault_enable();
-
        if (!ret)
                *oval = oldval;
 
index 0865ce7..72de967 100644 (file)
@@ -38,8 +38,6 @@ static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval,
        if (unlikely((((unsigned long) uaddr) & 0x3UL)))
                return -EINVAL;
 
-       pagefault_disable();
-
        switch (op) {
        case FUTEX_OP_SET:
                __futex_cas_op("mov\t%4, %1", ret, oldval, uaddr, oparg);
@@ -60,8 +58,6 @@ static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval,
                ret = -ENOSYS;
        }
 
-       pagefault_enable();
-
        if (!ret)
                *oval = oldval;
 
index 13c83fe..f9c0011 100644 (file)
 #include <asm/processor.h>
 #include <asm/smap.h>
 
-#define __futex_atomic_op1(insn, ret, oldval, uaddr, oparg)    \
-       asm volatile("\t" ASM_STAC "\n"                         \
-                    "1:\t" insn "\n"                           \
-                    "2:\t" ASM_CLAC "\n"                       \
+#define unsafe_atomic_op1(insn, oval, uaddr, oparg, label)     \
+do {                                                           \
+       int oldval = 0, ret;                                    \
+       asm volatile("1:\t" insn "\n"                           \
+                    "2:\n"                                     \
                     "\t.section .fixup,\"ax\"\n"               \
                     "3:\tmov\t%3, %1\n"                        \
                     "\tjmp\t2b\n"                              \
                     "\t.previous\n"                            \
                     _ASM_EXTABLE_UA(1b, 3b)                    \
                     : "=r" (oldval), "=r" (ret), "+m" (*uaddr) \
-                    : "i" (-EFAULT), "0" (oparg), "1" (0))
+                    : "i" (-EFAULT), "0" (oparg), "1" (0));    \
+       if (ret)                                                \
+               goto label;                                     \
+       *oval = oldval;                                         \
+} while(0)
 
-#define __futex_atomic_op2(insn, ret, oldval, uaddr, oparg)    \
-       asm volatile("\t" ASM_STAC "\n"                         \
-                    "1:\tmovl  %2, %0\n"                       \
-                    "\tmovl\t%0, %3\n"                         \
+
+#define unsafe_atomic_op2(insn, oval, uaddr, oparg, label)     \
+do {                                                           \
+       int oldval = 0, ret, tem;                               \
+       asm volatile("1:\tmovl  %2, %0\n"                       \
+                    "2:\tmovl\t%0, %3\n"                       \
                     "\t" insn "\n"                             \
-                    "2:\t" LOCK_PREFIX "cmpxchgl %3, %2\n"     \
-                    "\tjnz\t1b\n"                              \
-                    "3:\t" ASM_CLAC "\n"                       \
+                    "3:\t" LOCK_PREFIX "cmpxchgl %3, %2\n"     \
+                    "\tjnz\t2b\n"                              \
+                    "4:\n"                                     \
                     "\t.section .fixup,\"ax\"\n"               \
-                    "4:\tmov\t%5, %1\n"                        \
-                    "\tjmp\t3b\n"                              \
+                    "5:\tmov\t%5, %1\n"                        \
+                    "\tjmp\t4b\n"                              \
                     "\t.previous\n"                            \
-                    _ASM_EXTABLE_UA(1b, 4b)                    \
-                    _ASM_EXTABLE_UA(2b, 4b)                    \
+                    _ASM_EXTABLE_UA(1b, 5b)                    \
+                    _ASM_EXTABLE_UA(3b, 5b)                    \
                     : "=&a" (oldval), "=&r" (ret),             \
                       "+m" (*uaddr), "=&r" (tem)               \
-                    : "r" (oparg), "i" (-EFAULT), "1" (0))
+                    : "r" (oparg), "i" (-EFAULT), "1" (0));    \
+       if (ret)                                                \
+               goto label;                                     \
+       *oval = oldval;                                         \
+} while(0)
 
-static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval,
+static __always_inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval,
                u32 __user *uaddr)
 {
-       int oldval = 0, ret, tem;
-
-       pagefault_disable();
+       if (!user_access_begin(uaddr, sizeof(u32)))
+               return -EFAULT;
 
        switch (op) {
        case FUTEX_OP_SET:
-               __futex_atomic_op1("xchgl %0, %2", ret, oldval, uaddr, oparg);
+               unsafe_atomic_op1("xchgl %0, %2", oval, uaddr, oparg, Efault);
                break;
        case FUTEX_OP_ADD:
-               __futex_atomic_op1(LOCK_PREFIX "xaddl %0, %2", ret, oldval,
-                                  uaddr, oparg);
+               unsafe_atomic_op1(LOCK_PREFIX "xaddl %0, %2", oval,
+                                  uaddr, oparg, Efault);
                break;
        case FUTEX_OP_OR:
-               __futex_atomic_op2("orl %4, %3", ret, oldval, uaddr, oparg);
+               unsafe_atomic_op2("orl %4, %3", oval, uaddr, oparg, Efault);
                break;
        case FUTEX_OP_ANDN:
-               __futex_atomic_op2("andl %4, %3", ret, oldval, uaddr, ~oparg);
+               unsafe_atomic_op2("andl %4, %3", oval, uaddr, ~oparg, Efault);
                break;
        case FUTEX_OP_XOR:
-               __futex_atomic_op2("xorl %4, %3", ret, oldval, uaddr, oparg);
+               unsafe_atomic_op2("xorl %4, %3", oval, uaddr, oparg, Efault);
                break;
        default:
-               ret = -ENOSYS;
+               user_access_end();
+               return -ENOSYS;
        }
-
-       pagefault_enable();
-
-       if (!ret)
-               *oval = oldval;
-
-       return ret;
+       user_access_end();
+       return 0;
+Efault:
+       user_access_end();
+       return -EFAULT;
 }
 
 static inline int futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
                                                u32 oldval, u32 newval)
 {
-       return user_atomic_cmpxchg_inatomic(uval, uaddr, oldval, newval);
+       int ret = 0;
+
+       if (!user_access_begin(uaddr, sizeof(u32)))
+               return -EFAULT;
+       asm volatile("\n"
+               "1:\t" LOCK_PREFIX "cmpxchgl %4, %2\n"
+               "2:\n"
+               "\t.section .fixup, \"ax\"\n"
+               "3:\tmov     %3, %0\n"
+               "\tjmp     2b\n"
+               "\t.previous\n"
+               _ASM_EXTABLE_UA(1b, 3b)
+               : "+r" (ret), "=a" (oldval), "+m" (*uaddr)
+               : "i" (-EFAULT), "r" (newval), "1" (oldval)
+               : "memory"
+       );
+       user_access_end();
+       *uval = oldval;
+       return ret;
 }
 
 #endif
index 61d93f0..ea6fc64 100644 (file)
@@ -584,99 +584,6 @@ extern __must_check long strnlen_user(const char __user *str, long n);
 unsigned long __must_check clear_user(void __user *mem, unsigned long len);
 unsigned long __must_check __clear_user(void __user *mem, unsigned long len);
 
-extern void __cmpxchg_wrong_size(void)
-       __compiletime_error("Bad argument size for cmpxchg");
-
-#define __user_atomic_cmpxchg_inatomic(uval, ptr, old, new, size)      \
-({                                                                     \
-       int __ret = 0;                                                  \
-       __typeof__(*(ptr)) __old = (old);                               \
-       __typeof__(*(ptr)) __new = (new);                               \
-       __uaccess_begin_nospec();                                       \
-       switch (size) {                                                 \
-       case 1:                                                         \
-       {                                                               \
-               asm volatile("\n"                                       \
-                       "1:\t" LOCK_PREFIX "cmpxchgb %4, %2\n"          \
-                       "2:\n"                                          \
-                       "\t.section .fixup, \"ax\"\n"                   \
-                       "3:\tmov     %3, %0\n"                          \
-                       "\tjmp     2b\n"                                \
-                       "\t.previous\n"                                 \
-                       _ASM_EXTABLE_UA(1b, 3b)                         \
-                       : "+r" (__ret), "=a" (__old), "+m" (*(ptr))     \
-                       : "i" (-EFAULT), "q" (__new), "1" (__old)       \
-                       : "memory"                                      \
-               );                                                      \
-               break;                                                  \
-       }                                                               \
-       case 2:                                                         \
-       {                                                               \
-               asm volatile("\n"                                       \
-                       "1:\t" LOCK_PREFIX "cmpxchgw %4, %2\n"          \
-                       "2:\n"                                          \
-                       "\t.section .fixup, \"ax\"\n"                   \
-                       "3:\tmov     %3, %0\n"                          \
-                       "\tjmp     2b\n"                                \
-                       "\t.previous\n"                                 \
-                       _ASM_EXTABLE_UA(1b, 3b)                         \
-                       : "+r" (__ret), "=a" (__old), "+m" (*(ptr))     \
-                       : "i" (-EFAULT), "r" (__new), "1" (__old)       \
-                       : "memory"                                      \
-               );                                                      \
-               break;                                                  \
-       }                                                               \
-       case 4:                                                         \
-       {                                                               \
-               asm volatile("\n"                                       \
-                       "1:\t" LOCK_PREFIX "cmpxchgl %4, %2\n"          \
-                       "2:\n"                                          \
-                       "\t.section .fixup, \"ax\"\n"                   \
-                       "3:\tmov     %3, %0\n"                          \
-                       "\tjmp     2b\n"                                \
-                       "\t.previous\n"                                 \
-                       _ASM_EXTABLE_UA(1b, 3b)                         \
-                       : "+r" (__ret), "=a" (__old), "+m" (*(ptr))     \
-                       : "i" (-EFAULT), "r" (__new), "1" (__old)       \
-                       : "memory"                                      \
-               );                                                      \
-               break;                                                  \
-       }                                                               \
-       case 8:                                                         \
-       {                                                               \
-               if (!IS_ENABLED(CONFIG_X86_64))                         \
-                       __cmpxchg_wrong_size();                         \
-                                                                       \
-               asm volatile("\n"                                       \
-                       "1:\t" LOCK_PREFIX "cmpxchgq %4, %2\n"          \
-                       "2:\n"                                          \
-                       "\t.section .fixup, \"ax\"\n"                   \
-                       "3:\tmov     %3, %0\n"                          \
-                       "\tjmp     2b\n"                                \
-                       "\t.previous\n"                                 \
-                       _ASM_EXTABLE_UA(1b, 3b)                         \
-                       : "+r" (__ret), "=a" (__old), "+m" (*(ptr))     \
-                       : "i" (-EFAULT), "r" (__new), "1" (__old)       \
-                       : "memory"                                      \
-               );                                                      \
-               break;                                                  \
-       }                                                               \
-       default:                                                        \
-               __cmpxchg_wrong_size();                                 \
-       }                                                               \
-       __uaccess_end();                                                \
-       *(uval) = __old;                                                \
-       __ret;                                                          \
-})
-
-#define user_atomic_cmpxchg_inatomic(uval, ptr, old, new)              \
-({                                                                     \
-       access_ok((ptr), sizeof(*(ptr))) ?              \
-               __user_atomic_cmpxchg_inatomic((uval), (ptr),           \
-                               (old), (new), sizeof(*(ptr))) :         \
-               -EFAULT;                                                \
-})
-
 /*
  * movsl can be slow when source and dest are not both 8-byte aligned
  */
index 9646110..a1a27b2 100644 (file)
@@ -72,7 +72,8 @@ static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval,
 #if XCHAL_HAVE_S32C1I || XCHAL_HAVE_EXCLUSIVE
        int oldval = 0, ret;
 
-       pagefault_disable();
+       if (!access_ok(uaddr, sizeof(u32)))
+               return -EFAULT;
 
        switch (op) {
        case FUTEX_OP_SET:
@@ -99,8 +100,6 @@ static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval,
                ret = -ENOSYS;
        }
 
-       pagefault_enable();
-
        if (!ret)
                *oval = oldval;
 
index 02970b1..f4c3470 100644 (file)
@@ -34,7 +34,6 @@ arch_futex_atomic_op_inuser(int op, u32 oparg, int *oval, u32 __user *uaddr)
        u32 tmp;
 
        preempt_disable();
-       pagefault_disable();
 
        ret = -EFAULT;
        if (unlikely(get_user(oldval, uaddr) != 0))
@@ -67,7 +66,6 @@ arch_futex_atomic_op_inuser(int op, u32 oparg, int *oval, u32 __user *uaddr)
                ret = -EFAULT;
 
 out_pagefault_enable:
-       pagefault_enable();
        preempt_enable();
 
        if (ret == 0)
index b62cf94..23bc277 100644 (file)
@@ -1665,10 +1665,9 @@ static int futex_atomic_op_inuser(unsigned int encoded_op, u32 __user *uaddr)
                oparg = 1 << oparg;
        }
 
-       if (!access_ok(uaddr, sizeof(u32)))
-               return -EFAULT;
-
+       pagefault_disable();
        ret = arch_futex_atomic_op_inuser(op, oparg, &oldval, uaddr);
+       pagefault_enable();
        if (ret)
                return ret;
 
index 4768d91..3667c5d 100644 (file)
@@ -478,6 +478,7 @@ static const char *uaccess_safe_builtin[] = {
        "__sanitizer_cov_trace_cmp2",
        "__sanitizer_cov_trace_cmp4",
        "__sanitizer_cov_trace_cmp8",
+       "__sanitizer_cov_trace_switch",
        /* UBSAN */
        "ubsan_type_mismatch_common",
        "__ubsan_handle_type_mismatch",