Commit 0318bc8a authored by Andy Lutomirski's avatar Andy Lutomirski Committed by Ingo Molnar

signals/sigaltstack: Report current flag bits in sigaltstack()

sigaltstack()'s reported previous state uses a somewhat odd
convention, but the concept of flag bits is new, and we can do the
flag bits sensibly.  Specifically, let's just report them directly.

This will allow saving and restoring the sigaltstack state using
sigaltstack() to work correctly.
Signed-off-by: default avatarAndy Lutomirski <luto@kernel.org>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Amanieu d'Antras <amanieu@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Pavel Emelyanov <xemul@parallels.com>
Cc: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Richard Weinberger <richard@nod.at>
Cc: Sasha Levin <sasha.levin@oracle.com>
Cc: Shuah Khan <shuahkh@osg.samsung.com>
Cc: Stas Sergeev <stsp@list.ru>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vladimir Davydov <vdavydov@parallels.com>
Cc: linux-api@vger.kernel.org
Link: http://lkml.kernel.org/r/94b291ec9fd47741a9264851e316e158ded0b00d.1462296606.git.luto@kernel.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 158b67b5
...@@ -3099,7 +3099,8 @@ do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long s ...@@ -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_sp = (void __user *) current->sas_ss_sp;
oss.ss_size = current->sas_ss_size; 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) { if (uss) {
void __user *ss_sp; void __user *ss_sp;
......
...@@ -113,6 +113,19 @@ int main(void) ...@@ -113,6 +113,19 @@ int main(void)
perror("mmap()"); perror("mmap()");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
err = sigaltstack(NULL, &stk);
if (err) {
perror("[FAIL]\tsigaltstack()");
exit(EXIT_FAILURE);
}
if (stk.ss_flags == SS_DISABLE) {
printf("[OK]\tInitial sigaltstack state was SS_DISABLE\n");
} else {
printf("[FAIL]\tInitial sigaltstack state was %i; should have been SS_DISABLE\n", stk.ss_flags);
return EXIT_FAILURE;
}
stk.ss_sp = sstack; stk.ss_sp = sstack;
stk.ss_size = SIGSTKSZ; stk.ss_size = SIGSTKSZ;
stk.ss_flags = SS_ONSTACK | SS_AUTODISARM; stk.ss_flags = SS_ONSTACK | SS_AUTODISARM;
...@@ -151,12 +164,12 @@ int main(void) ...@@ -151,12 +164,12 @@ int main(void)
perror("[FAIL]\tsigaltstack()"); perror("[FAIL]\tsigaltstack()");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if (stk.ss_flags != 0) { if (stk.ss_flags != SS_AUTODISARM) {
printf("[FAIL]\tss_flags=%i, should be 0\n", printf("[FAIL]\tss_flags=%i, should be SS_AUTODISARM\n",
stk.ss_flags); stk.ss_flags);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
printf("[OK]\tsigaltstack is enabled after signal\n"); printf("[OK]\tsigaltstack is still SS_AUTODISARM after signal\n");
printf("[OK]\tTest passed\n"); printf("[OK]\tTest passed\n");
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment