signals/sigaltstack: Report current flag bits in sigaltstack()
[cascardo/linux.git] / kernel / signal.c
index b1c6eb4..ab122a2 100644 (file)
@@ -3099,7 +3099,8 @@ do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long s
 
        oss.ss_sp = (void __user *) current->sas_ss_sp;
        oss.ss_size = current->sas_ss_size;
-       oss.ss_flags = sas_ss_flags(sp);
+       oss.ss_flags = sas_ss_flags(sp) |
+               (current->sas_ss_flags & SS_FLAG_BITS);
 
        if (uss) {
                void __user *ss_sp;
@@ -3137,6 +3138,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_size = ss_size;
+               current->sas_ss_flags = ss_flags;
        }
 
        error = 0;
@@ -3167,9 +3169,14 @@ int restore_altstack(const stack_t __user *uss)
 int __save_altstack(stack_t __user *uss, unsigned long sp)
 {
        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);
+       if (err)
+               return err;
+       if (t->sas_ss_flags & SS_AUTODISARM)
+               sas_ss_reset(t);
+       return 0;
 }
 
 #ifdef CONFIG_COMPAT