|
@@ -3137,6 +3137,7 @@ do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long s
|
|
|
|
|
|
|
|
current->sas_ss_sp = (unsigned long) ss_sp;
|
|
current->sas_ss_sp = (unsigned long) ss_sp;
|
|
|
current->sas_ss_size = ss_size;
|
|
current->sas_ss_size = ss_size;
|
|
|
|
|
+ current->sas_ss_flags = ss_flags;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
error = 0;
|
|
error = 0;
|
|
@@ -3167,9 +3168,14 @@ int restore_altstack(const stack_t __user *uss)
|
|
|
int __save_altstack(stack_t __user *uss, unsigned long sp)
|
|
int __save_altstack(stack_t __user *uss, unsigned long sp)
|
|
|
{
|
|
{
|
|
|
struct task_struct *t = current;
|
|
struct task_struct *t = current;
|
|
|
- return __put_user((void __user *)t->sas_ss_sp, &uss->ss_sp) |
|
|
|
|
|
- __put_user(sas_ss_flags(sp), &uss->ss_flags) |
|
|
|
|
|
|
|
+ int err = __put_user((void __user *)t->sas_ss_sp, &uss->ss_sp) |
|
|
|
|
|
+ __put_user(t->sas_ss_flags, &uss->ss_flags) |
|
|
|
__put_user(t->sas_ss_size, &uss->ss_size);
|
|
__put_user(t->sas_ss_size, &uss->ss_size);
|
|
|
|
|
+ if (err)
|
|
|
|
|
+ return err;
|
|
|
|
|
+ if (t->sas_ss_flags & SS_AUTODISARM)
|
|
|
|
|
+ sas_ss_reset(t);
|
|
|
|
|
+ return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
#ifdef CONFIG_COMPAT
|
|
#ifdef CONFIG_COMPAT
|