|
@@ -61,8 +61,7 @@
|
|
regs->seg = GET_SEG(seg) | 3; \
|
|
regs->seg = GET_SEG(seg) | 3; \
|
|
} while (0)
|
|
} while (0)
|
|
|
|
|
|
-int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,
|
|
|
|
- unsigned long *pax)
|
|
|
|
|
|
+int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
|
|
{
|
|
{
|
|
void __user *buf;
|
|
void __user *buf;
|
|
unsigned int tmpflags;
|
|
unsigned int tmpflags;
|
|
@@ -81,7 +80,7 @@ int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,
|
|
#endif /* CONFIG_X86_32 */
|
|
#endif /* CONFIG_X86_32 */
|
|
|
|
|
|
COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx);
|
|
COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx);
|
|
- COPY(dx); COPY(cx); COPY(ip);
|
|
|
|
|
|
+ COPY(dx); COPY(cx); COPY(ip); COPY(ax);
|
|
|
|
|
|
#ifdef CONFIG_X86_64
|
|
#ifdef CONFIG_X86_64
|
|
COPY(r8);
|
|
COPY(r8);
|
|
@@ -102,8 +101,6 @@ int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,
|
|
regs->orig_ax = -1; /* disable syscall checks */
|
|
regs->orig_ax = -1; /* disable syscall checks */
|
|
|
|
|
|
get_user_ex(buf, &sc->fpstate);
|
|
get_user_ex(buf, &sc->fpstate);
|
|
-
|
|
|
|
- get_user_ex(*pax, &sc->ax);
|
|
|
|
} get_user_catch(err);
|
|
} get_user_catch(err);
|
|
|
|
|
|
err |= restore_xstate_sig(buf, config_enabled(CONFIG_X86_32));
|
|
err |= restore_xstate_sig(buf, config_enabled(CONFIG_X86_32));
|
|
@@ -545,7 +542,6 @@ asmlinkage unsigned long sys_sigreturn(void)
|
|
{
|
|
{
|
|
struct pt_regs *regs = current_pt_regs();
|
|
struct pt_regs *regs = current_pt_regs();
|
|
struct sigframe __user *frame;
|
|
struct sigframe __user *frame;
|
|
- unsigned long ax;
|
|
|
|
sigset_t set;
|
|
sigset_t set;
|
|
|
|
|
|
frame = (struct sigframe __user *)(regs->sp - 8);
|
|
frame = (struct sigframe __user *)(regs->sp - 8);
|
|
@@ -559,9 +555,9 @@ asmlinkage unsigned long sys_sigreturn(void)
|
|
|
|
|
|
set_current_blocked(&set);
|
|
set_current_blocked(&set);
|
|
|
|
|
|
- if (restore_sigcontext(regs, &frame->sc, &ax))
|
|
|
|
|
|
+ if (restore_sigcontext(regs, &frame->sc))
|
|
goto badframe;
|
|
goto badframe;
|
|
- return ax;
|
|
|
|
|
|
+ return regs->ax;
|
|
|
|
|
|
badframe:
|
|
badframe:
|
|
signal_fault(regs, frame, "sigreturn");
|
|
signal_fault(regs, frame, "sigreturn");
|
|
@@ -574,7 +570,6 @@ asmlinkage long sys_rt_sigreturn(void)
|
|
{
|
|
{
|
|
struct pt_regs *regs = current_pt_regs();
|
|
struct pt_regs *regs = current_pt_regs();
|
|
struct rt_sigframe __user *frame;
|
|
struct rt_sigframe __user *frame;
|
|
- unsigned long ax;
|
|
|
|
sigset_t set;
|
|
sigset_t set;
|
|
|
|
|
|
frame = (struct rt_sigframe __user *)(regs->sp - sizeof(long));
|
|
frame = (struct rt_sigframe __user *)(regs->sp - sizeof(long));
|
|
@@ -585,13 +580,13 @@ asmlinkage long sys_rt_sigreturn(void)
|
|
|
|
|
|
set_current_blocked(&set);
|
|
set_current_blocked(&set);
|
|
|
|
|
|
- if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax))
|
|
|
|
|
|
+ if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
|
|
goto badframe;
|
|
goto badframe;
|
|
|
|
|
|
if (restore_altstack(&frame->uc.uc_stack))
|
|
if (restore_altstack(&frame->uc.uc_stack))
|
|
goto badframe;
|
|
goto badframe;
|
|
|
|
|
|
- return ax;
|
|
|
|
|
|
+ return regs->ax;
|
|
|
|
|
|
badframe:
|
|
badframe:
|
|
signal_fault(regs, frame, "rt_sigreturn");
|
|
signal_fault(regs, frame, "rt_sigreturn");
|
|
@@ -786,7 +781,6 @@ asmlinkage long sys32_x32_rt_sigreturn(void)
|
|
struct pt_regs *regs = current_pt_regs();
|
|
struct pt_regs *regs = current_pt_regs();
|
|
struct rt_sigframe_x32 __user *frame;
|
|
struct rt_sigframe_x32 __user *frame;
|
|
sigset_t set;
|
|
sigset_t set;
|
|
- unsigned long ax;
|
|
|
|
|
|
|
|
frame = (struct rt_sigframe_x32 __user *)(regs->sp - 8);
|
|
frame = (struct rt_sigframe_x32 __user *)(regs->sp - 8);
|
|
|
|
|
|
@@ -797,13 +791,13 @@ asmlinkage long sys32_x32_rt_sigreturn(void)
|
|
|
|
|
|
set_current_blocked(&set);
|
|
set_current_blocked(&set);
|
|
|
|
|
|
- if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax))
|
|
|
|
|
|
+ if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
|
|
goto badframe;
|
|
goto badframe;
|
|
|
|
|
|
if (compat_restore_altstack(&frame->uc.uc_stack))
|
|
if (compat_restore_altstack(&frame->uc.uc_stack))
|
|
goto badframe;
|
|
goto badframe;
|
|
|
|
|
|
- return ax;
|
|
|
|
|
|
+ return regs->ax;
|
|
|
|
|
|
badframe:
|
|
badframe:
|
|
signal_fault(regs, frame, "x32 rt_sigreturn");
|
|
signal_fault(regs, frame, "x32 rt_sigreturn");
|