aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/kernel/signal.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
index bd8810d4acb3..0ae74207e43e 100644
--- a/arch/arm/kernel/signal.c
+++ b/arch/arm/kernel/signal.c
@@ -176,6 +176,7 @@ static int restore_vfp_context(char __user **auxp)
176 176
177static int restore_sigframe(struct pt_regs *regs, struct sigframe __user *sf) 177static int restore_sigframe(struct pt_regs *regs, struct sigframe __user *sf)
178{ 178{
179 struct sigcontext context;
179 char __user *aux; 180 char __user *aux;
180 sigset_t set; 181 sigset_t set;
181 int err; 182 int err;
@@ -184,23 +185,26 @@ static int restore_sigframe(struct pt_regs *regs, struct sigframe __user *sf)
184 if (err == 0) 185 if (err == 0)
185 set_current_blocked(&set); 186 set_current_blocked(&set);
186 187
187 __get_user_error(regs->ARM_r0, &sf->uc.uc_mcontext.arm_r0, err); 188 err |= __copy_from_user(&context, &sf->uc.uc_mcontext, sizeof(context));
188 __get_user_error(regs->ARM_r1, &sf->uc.uc_mcontext.arm_r1, err); 189 if (err == 0) {
189 __get_user_error(regs->ARM_r2, &sf->uc.uc_mcontext.arm_r2, err); 190 regs->ARM_r0 = context.arm_r0;
190 __get_user_error(regs->ARM_r3, &sf->uc.uc_mcontext.arm_r3, err); 191 regs->ARM_r1 = context.arm_r1;
191 __get_user_error(regs->ARM_r4, &sf->uc.uc_mcontext.arm_r4, err); 192 regs->ARM_r2 = context.arm_r2;
192 __get_user_error(regs->ARM_r5, &sf->uc.uc_mcontext.arm_r5, err); 193 regs->ARM_r3 = context.arm_r3;
193 __get_user_error(regs->ARM_r6, &sf->uc.uc_mcontext.arm_r6, err); 194 regs->ARM_r4 = context.arm_r4;
194 __get_user_error(regs->ARM_r7, &sf->uc.uc_mcontext.arm_r7, err); 195 regs->ARM_r5 = context.arm_r5;
195 __get_user_error(regs->ARM_r8, &sf->uc.uc_mcontext.arm_r8, err); 196 regs->ARM_r6 = context.arm_r6;
196 __get_user_error(regs->ARM_r9, &sf->uc.uc_mcontext.arm_r9, err); 197 regs->ARM_r7 = context.arm_r7;
197 __get_user_error(regs->ARM_r10, &sf->uc.uc_mcontext.arm_r10, err); 198 regs->ARM_r8 = context.arm_r8;
198 __get_user_error(regs->ARM_fp, &sf->uc.uc_mcontext.arm_fp, err); 199 regs->ARM_r9 = context.arm_r9;
199 __get_user_error(regs->ARM_ip, &sf->uc.uc_mcontext.arm_ip, err); 200 regs->ARM_r10 = context.arm_r10;
200 __get_user_error(regs->ARM_sp, &sf->uc.uc_mcontext.arm_sp, err); 201 regs->ARM_fp = context.arm_fp;
201 __get_user_error(regs->ARM_lr, &sf->uc.uc_mcontext.arm_lr, err); 202 regs->ARM_ip = context.arm_ip;
202 __get_user_error(regs->ARM_pc, &sf->uc.uc_mcontext.arm_pc, err); 203 regs->ARM_sp = context.arm_sp;
203 __get_user_error(regs->ARM_cpsr, &sf->uc.uc_mcontext.arm_cpsr, err); 204 regs->ARM_lr = context.arm_lr;
205 regs->ARM_pc = context.arm_pc;
206 regs->ARM_cpsr = context.arm_cpsr;
207 }
204 208
205 err |= !valid_user_regs(regs); 209 err |= !valid_user_regs(regs);
206 210