OSDN Git Service

powerpc/signal64: Don't opencode page prefaulting
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Tue, 7 Jul 2020 18:32:25 +0000 (18:32 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 15 Jul 2020 02:04:40 +0000 (12:04 +1000)
Instead of doing a __get_user() from the first and last location
into a tmp var which won't be used, use fault_in_pages_readable()

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/810bd8840ef990a200f58c9dea9abe767ca02a3a.1594146723.git.christophe.leroy@csgroup.eu
arch/powerpc/kernel/signal_64.c

index 9772964..bfc9393 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/ptrace.h>
 #include <linux/ratelimit.h>
 #include <linux/syscalls.h>
+#include <linux/pagemap.h>
 
 #include <asm/sigcontext.h>
 #include <asm/ucontext.h>
@@ -634,7 +635,6 @@ static long setup_trampoline(unsigned int syscall, unsigned int __user *tramp)
 SYSCALL_DEFINE3(swapcontext, struct ucontext __user *, old_ctx,
                struct ucontext __user *, new_ctx, long, ctx_size)
 {
-       unsigned char tmp;
        sigset_t set;
        unsigned long new_msr = 0;
        int ctx_has_vsx_region = 0;
@@ -669,9 +669,8 @@ SYSCALL_DEFINE3(swapcontext, struct ucontext __user *, old_ctx,
        }
        if (new_ctx == NULL)
                return 0;
-       if (!access_ok(new_ctx, ctx_size)
-           || __get_user(tmp, (u8 __user *) new_ctx)
-           || __get_user(tmp, (u8 __user *) new_ctx + ctx_size - 1))
+       if (!access_ok(new_ctx, ctx_size) ||
+           fault_in_pages_readable((u8 __user *)new_ctx, ctx_size))
                return -EFAULT;
 
        /*