aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/ia32/ia32_signal.c2
-rw-r--r--arch/x86/kernel/signal.c6
-rw-r--r--include/linux/compat.h7
-rw-r--r--include/linux/signal.h8
4 files changed, 19 insertions, 4 deletions
diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c
index bccfca68430e..665a730307f2 100644
--- a/arch/x86/ia32/ia32_signal.c
+++ b/arch/x86/ia32/ia32_signal.c
@@ -457,7 +457,7 @@ int ia32_setup_rt_frame(int sig, struct ksignal *ksig,
457 else 457 else
458 put_user_ex(0, &frame->uc.uc_flags); 458 put_user_ex(0, &frame->uc.uc_flags);
459 put_user_ex(0, &frame->uc.uc_link); 459 put_user_ex(0, &frame->uc.uc_link);
460 err |= __compat_save_altstack(&frame->uc.uc_stack, regs->sp); 460 compat_save_altstack_ex(&frame->uc.uc_stack, regs->sp);
461 461
462 if (ksig->ka.sa.sa_flags & SA_RESTORER) 462 if (ksig->ka.sa.sa_flags & SA_RESTORER)
463 restorer = ksig->ka.sa.sa_restorer; 463 restorer = ksig->ka.sa.sa_restorer;
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
index cf913587d4dd..d859eea07db7 100644
--- a/arch/x86/kernel/signal.c
+++ b/arch/x86/kernel/signal.c
@@ -358,7 +358,7 @@ static int __setup_rt_frame(int sig, struct ksignal *ksig,
358 else 358 else
359 put_user_ex(0, &frame->uc.uc_flags); 359 put_user_ex(0, &frame->uc.uc_flags);
360 put_user_ex(0, &frame->uc.uc_link); 360 put_user_ex(0, &frame->uc.uc_link);
361 err |= __save_altstack(&frame->uc.uc_stack, regs->sp); 361 save_altstack_ex(&frame->uc.uc_stack, regs->sp);
362 362
363 /* Set up to return from userspace. */ 363 /* Set up to return from userspace. */
364 restorer = VDSO32_SYMBOL(current->mm->context.vdso, rt_sigreturn); 364 restorer = VDSO32_SYMBOL(current->mm->context.vdso, rt_sigreturn);
@@ -423,7 +423,7 @@ static int __setup_rt_frame(int sig, struct ksignal *ksig,
423 else 423 else
424 put_user_ex(0, &frame->uc.uc_flags); 424 put_user_ex(0, &frame->uc.uc_flags);
425 put_user_ex(0, &frame->uc.uc_link); 425 put_user_ex(0, &frame->uc.uc_link);
426 err |= __save_altstack(&frame->uc.uc_stack, regs->sp); 426 save_altstack_ex(&frame->uc.uc_stack, regs->sp);
427 427
428 /* Set up to return from userspace. If provided, use a stub 428 /* Set up to return from userspace. If provided, use a stub
429 already in userspace. */ 429 already in userspace. */
@@ -490,7 +490,7 @@ static int x32_setup_rt_frame(struct ksignal *ksig,
490 else 490 else
491 put_user_ex(0, &frame->uc.uc_flags); 491 put_user_ex(0, &frame->uc.uc_flags);
492 put_user_ex(0, &frame->uc.uc_link); 492 put_user_ex(0, &frame->uc.uc_link);
493 err |= __compat_save_altstack(&frame->uc.uc_stack, regs->sp); 493 compat_save_altstack_ex(&frame->uc.uc_stack, regs->sp);
494 put_user_ex(0, &frame->uc.uc__pad0); 494 put_user_ex(0, &frame->uc.uc__pad0);
495 495
496 if (ksig->ka.sa.sa_flags & SA_RESTORER) { 496 if (ksig->ka.sa.sa_flags & SA_RESTORER) {
diff --git a/include/linux/compat.h b/include/linux/compat.h
index 7f0c1dd09079..ec1aee4aec9c 100644
--- a/include/linux/compat.h
+++ b/include/linux/compat.h
@@ -669,6 +669,13 @@ asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr,
669 669
670int compat_restore_altstack(const compat_stack_t __user *uss); 670int compat_restore_altstack(const compat_stack_t __user *uss);
671int __compat_save_altstack(compat_stack_t __user *, unsigned long); 671int __compat_save_altstack(compat_stack_t __user *, unsigned long);
672#define compat_save_altstack_ex(uss, sp) do { \
673 compat_stack_t __user *__uss = uss; \
674 struct task_struct *t = current; \
675 put_user_ex(ptr_to_compat((void __user *)t->sas_ss_sp), &__uss->ss_sp); \
676 put_user_ex(sas_ss_flags(sp), &__uss->ss_flags); \
677 put_user_ex(t->sas_ss_size, &__uss->ss_size); \
678} while (0);
672 679
673asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid, 680asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid,
674 struct compat_timespec __user *interval); 681 struct compat_timespec __user *interval);
diff --git a/include/linux/signal.h b/include/linux/signal.h
index d897484730c0..2ac423bdb676 100644
--- a/include/linux/signal.h
+++ b/include/linux/signal.h
@@ -434,6 +434,14 @@ void signals_init(void);
434int restore_altstack(const stack_t __user *); 434int restore_altstack(const stack_t __user *);
435int __save_altstack(stack_t __user *, unsigned long); 435int __save_altstack(stack_t __user *, unsigned long);
436 436
437#define save_altstack_ex(uss, sp) do { \
438 stack_t __user *__uss = uss; \
439 struct task_struct *t = current; \
440 put_user_ex((void __user *)t->sas_ss_sp, &__uss->ss_sp); \
441 put_user_ex(sas_ss_flags(sp), &__uss->ss_flags); \
442 put_user_ex(t->sas_ss_size, &__uss->ss_size); \
443} while (0);
444
437#ifdef CONFIG_PROC_FS 445#ifdef CONFIG_PROC_FS
438struct seq_file; 446struct seq_file;
439extern void render_sigset_t(struct seq_file *, const char *, sigset_t *); 447extern void render_sigset_t(struct seq_file *, const char *, sigset_t *);