Skip to content

Commit d2d2728

Browse files
author
Al Viro
committed
x86: switch ia32_setup_sigcontext() to unsafe_put_user()
Signed-off-by: Al Viro <[email protected]>
1 parent 9f855c0 commit d2d2728

File tree

1 file changed

+33
-31
lines changed

1 file changed

+33
-31
lines changed

arch/x86/ia32/ia32_signal.c

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -158,38 +158,40 @@ static int ia32_setup_sigcontext(struct sigcontext_32 __user *sc,
158158
void __user *fpstate,
159159
struct pt_regs *regs, unsigned int mask)
160160
{
161-
int err = 0;
162-
163-
put_user_try {
164-
put_user_ex(get_user_seg(gs), (unsigned int __user *)&sc->gs);
165-
put_user_ex(get_user_seg(fs), (unsigned int __user *)&sc->fs);
166-
put_user_ex(get_user_seg(ds), (unsigned int __user *)&sc->ds);
167-
put_user_ex(get_user_seg(es), (unsigned int __user *)&sc->es);
168-
169-
put_user_ex(regs->di, &sc->di);
170-
put_user_ex(regs->si, &sc->si);
171-
put_user_ex(regs->bp, &sc->bp);
172-
put_user_ex(regs->sp, &sc->sp);
173-
put_user_ex(regs->bx, &sc->bx);
174-
put_user_ex(regs->dx, &sc->dx);
175-
put_user_ex(regs->cx, &sc->cx);
176-
put_user_ex(regs->ax, &sc->ax);
177-
put_user_ex(current->thread.trap_nr, &sc->trapno);
178-
put_user_ex(current->thread.error_code, &sc->err);
179-
put_user_ex(regs->ip, &sc->ip);
180-
put_user_ex(regs->cs, (unsigned int __user *)&sc->cs);
181-
put_user_ex(regs->flags, &sc->flags);
182-
put_user_ex(regs->sp, &sc->sp_at_signal);
183-
put_user_ex(regs->ss, (unsigned int __user *)&sc->ss);
184-
185-
put_user_ex(ptr_to_compat(fpstate), &sc->fpstate);
186-
187-
/* non-iBCS2 extensions.. */
188-
put_user_ex(mask, &sc->oldmask);
189-
put_user_ex(current->thread.cr2, &sc->cr2);
190-
} put_user_catch(err);
161+
if (!user_access_begin(sc, sizeof(struct sigcontext_32)))
162+
return -EFAULT;
191163

192-
return err;
164+
unsafe_put_user(get_user_seg(gs), (unsigned int __user *)&sc->gs, Efault);
165+
unsafe_put_user(get_user_seg(fs), (unsigned int __user *)&sc->fs, Efault);
166+
unsafe_put_user(get_user_seg(ds), (unsigned int __user *)&sc->ds, Efault);
167+
unsafe_put_user(get_user_seg(es), (unsigned int __user *)&sc->es, Efault);
168+
169+
unsafe_put_user(regs->di, &sc->di, Efault);
170+
unsafe_put_user(regs->si, &sc->si, Efault);
171+
unsafe_put_user(regs->bp, &sc->bp, Efault);
172+
unsafe_put_user(regs->sp, &sc->sp, Efault);
173+
unsafe_put_user(regs->bx, &sc->bx, Efault);
174+
unsafe_put_user(regs->dx, &sc->dx, Efault);
175+
unsafe_put_user(regs->cx, &sc->cx, Efault);
176+
unsafe_put_user(regs->ax, &sc->ax, Efault);
177+
unsafe_put_user(current->thread.trap_nr, &sc->trapno, Efault);
178+
unsafe_put_user(current->thread.error_code, &sc->err, Efault);
179+
unsafe_put_user(regs->ip, &sc->ip, Efault);
180+
unsafe_put_user(regs->cs, (unsigned int __user *)&sc->cs, Efault);
181+
unsafe_put_user(regs->flags, &sc->flags, Efault);
182+
unsafe_put_user(regs->sp, &sc->sp_at_signal, Efault);
183+
unsafe_put_user(regs->ss, (unsigned int __user *)&sc->ss, Efault);
184+
185+
unsafe_put_user(ptr_to_compat(fpstate), &sc->fpstate, Efault);
186+
187+
/* non-iBCS2 extensions.. */
188+
unsafe_put_user(mask, &sc->oldmask, Efault);
189+
unsafe_put_user(current->thread.cr2, &sc->cr2, Efault);
190+
user_access_end();
191+
return 0;
192+
Efault:
193+
user_access_end();
194+
return -EFAULT;
193195
}
194196

195197
/*

0 commit comments

Comments
 (0)