]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
x86: switch setup_sigcontext() to unsafe_put_user()
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 15 Feb 2020 22:25:27 +0000 (17:25 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 19 Mar 2020 00:39:02 +0000 (20:39 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/x86/include/asm/sighandling.h
arch/x86/kernel/signal.c

index 2fcbd6f33ef74b22b9a3245261a17f13ca6b8855..35e0b579ffcbec607960ea7fdfd973fb391060bd 100644 (file)
@@ -14,9 +14,6 @@
                         X86_EFLAGS_CF | X86_EFLAGS_RF)
 
 void signal_fault(struct pt_regs *regs, void __user *frame, char *where);
-int setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate,
-                    struct pt_regs *regs, unsigned long mask);
-
 
 #ifdef CONFIG_X86_X32_ABI
 asmlinkage long sys32_x32_rt_sigreturn(void);
index 83563e98f0be9463bf24ba6c51ceb5f397457986..3b4ca484cfc26c60bec3d76ebb269798f0a1c049 100644 (file)
@@ -140,63 +140,65 @@ static int restore_sigcontext(struct pt_regs *regs,
                               IS_ENABLED(CONFIG_X86_32));
 }
 
-int setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate,
+static int setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate,
                     struct pt_regs *regs, unsigned long mask)
 {
-       int err = 0;
-
-       put_user_try {
+       if (!user_access_begin(sc, sizeof(struct sigcontext)))
+               return -EFAULT;
 
 #ifdef CONFIG_X86_32
-               put_user_ex(get_user_gs(regs), (unsigned int __user *)&sc->gs);
-               put_user_ex(regs->fs, (unsigned int __user *)&sc->fs);
-               put_user_ex(regs->es, (unsigned int __user *)&sc->es);
-               put_user_ex(regs->ds, (unsigned int __user *)&sc->ds);
+       unsafe_put_user(get_user_gs(regs),
+                                 (unsigned int __user *)&sc->gs, Efault);
+       unsafe_put_user(regs->fs, (unsigned int __user *)&sc->fs, Efault);
+       unsafe_put_user(regs->es, (unsigned int __user *)&sc->es, Efault);
+       unsafe_put_user(regs->ds, (unsigned int __user *)&sc->ds, Efault);
 #endif /* CONFIG_X86_32 */
 
-               put_user_ex(regs->di, &sc->di);
-               put_user_ex(regs->si, &sc->si);
-               put_user_ex(regs->bp, &sc->bp);
-               put_user_ex(regs->sp, &sc->sp);
-               put_user_ex(regs->bx, &sc->bx);
-               put_user_ex(regs->dx, &sc->dx);
-               put_user_ex(regs->cx, &sc->cx);
-               put_user_ex(regs->ax, &sc->ax);
+       unsafe_put_user(regs->di, &sc->di, Efault);
+       unsafe_put_user(regs->si, &sc->si, Efault);
+       unsafe_put_user(regs->bp, &sc->bp, Efault);
+       unsafe_put_user(regs->sp, &sc->sp, Efault);
+       unsafe_put_user(regs->bx, &sc->bx, Efault);
+       unsafe_put_user(regs->dx, &sc->dx, Efault);
+       unsafe_put_user(regs->cx, &sc->cx, Efault);
+       unsafe_put_user(regs->ax, &sc->ax, Efault);
 #ifdef CONFIG_X86_64
-               put_user_ex(regs->r8, &sc->r8);
-               put_user_ex(regs->r9, &sc->r9);
-               put_user_ex(regs->r10, &sc->r10);
-               put_user_ex(regs->r11, &sc->r11);
-               put_user_ex(regs->r12, &sc->r12);
-               put_user_ex(regs->r13, &sc->r13);
-               put_user_ex(regs->r14, &sc->r14);
-               put_user_ex(regs->r15, &sc->r15);
+       unsafe_put_user(regs->r8, &sc->r8, Efault);
+       unsafe_put_user(regs->r9, &sc->r9, Efault);
+       unsafe_put_user(regs->r10, &sc->r10, Efault);
+       unsafe_put_user(regs->r11, &sc->r11, Efault);
+       unsafe_put_user(regs->r12, &sc->r12, Efault);
+       unsafe_put_user(regs->r13, &sc->r13, Efault);
+       unsafe_put_user(regs->r14, &sc->r14, Efault);
+       unsafe_put_user(regs->r15, &sc->r15, Efault);
 #endif /* CONFIG_X86_64 */
 
-               put_user_ex(current->thread.trap_nr, &sc->trapno);
-               put_user_ex(current->thread.error_code, &sc->err);
-               put_user_ex(regs->ip, &sc->ip);
+       unsafe_put_user(current->thread.trap_nr, &sc->trapno, Efault);
+       unsafe_put_user(current->thread.error_code, &sc->err, Efault);
+       unsafe_put_user(regs->ip, &sc->ip, Efault);
 #ifdef CONFIG_X86_32
-               put_user_ex(regs->cs, (unsigned int __user *)&sc->cs);
-               put_user_ex(regs->flags, &sc->flags);
-               put_user_ex(regs->sp, &sc->sp_at_signal);
-               put_user_ex(regs->ss, (unsigned int __user *)&sc->ss);
+       unsafe_put_user(regs->cs, (unsigned int __user *)&sc->cs, Efault);
+       unsafe_put_user(regs->flags, &sc->flags, Efault);
+       unsafe_put_user(regs->sp, &sc->sp_at_signal, Efault);
+       unsafe_put_user(regs->ss, (unsigned int __user *)&sc->ss, Efault);
 #else /* !CONFIG_X86_32 */
-               put_user_ex(regs->flags, &sc->flags);
-               put_user_ex(regs->cs, &sc->cs);
-               put_user_ex(0, &sc->gs);
-               put_user_ex(0, &sc->fs);
-               put_user_ex(regs->ss, &sc->ss);
+       unsafe_put_user(regs->flags, &sc->flags, Efault);
+       unsafe_put_user(regs->cs, &sc->cs, Efault);
+       unsafe_put_user(0, &sc->gs, Efault);
+       unsafe_put_user(0, &sc->fs, Efault);
+       unsafe_put_user(regs->ss, &sc->ss, Efault);
 #endif /* CONFIG_X86_32 */
 
-               put_user_ex(fpstate, (unsigned long __user *)&sc->fpstate);
+       unsafe_put_user(fpstate, (unsigned long __user *)&sc->fpstate, Efault);
 
-               /* non-iBCS2 extensions.. */
-               put_user_ex(mask, &sc->oldmask);
-               put_user_ex(current->thread.cr2, &sc->cr2);
-       } put_user_catch(err);
-
-       return err;
+       /* non-iBCS2 extensions.. */
+       unsafe_put_user(mask, &sc->oldmask, Efault);
+       unsafe_put_user(current->thread.cr2, &sc->cr2, Efault);
+       user_access_end();
+       return 0;
+Efault:
+       user_access_end();
+       return -EFAULT;
 }
 
 /*