Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: Andy 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.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>

authored by

Andy Lutomirski and committed by
Ingo Molnar
0318bc8a 158b67b5

+18 -4
+2 -1
kernel/signal.c
··· 3099 3099 3100 3100 oss.ss_sp = (void __user *) current->sas_ss_sp; 3101 3101 oss.ss_size = current->sas_ss_size; 3102 - oss.ss_flags = sas_ss_flags(sp); 3102 + oss.ss_flags = sas_ss_flags(sp) | 3103 + (current->sas_ss_flags & SS_FLAG_BITS); 3103 3104 3104 3105 if (uss) { 3105 3106 void __user *ss_sp;
+16 -3
tools/testing/selftests/sigaltstack/sas.c
··· 113 113 perror("mmap()"); 114 114 return EXIT_FAILURE; 115 115 } 116 + 117 + err = sigaltstack(NULL, &stk); 118 + if (err) { 119 + perror("[FAIL]\tsigaltstack()"); 120 + exit(EXIT_FAILURE); 121 + } 122 + if (stk.ss_flags == SS_DISABLE) { 123 + printf("[OK]\tInitial sigaltstack state was SS_DISABLE\n"); 124 + } else { 125 + printf("[FAIL]\tInitial sigaltstack state was %i; should have been SS_DISABLE\n", stk.ss_flags); 126 + return EXIT_FAILURE; 127 + } 128 + 116 129 stk.ss_sp = sstack; 117 130 stk.ss_size = SIGSTKSZ; 118 131 stk.ss_flags = SS_ONSTACK | SS_AUTODISARM; ··· 164 151 perror("[FAIL]\tsigaltstack()"); 165 152 exit(EXIT_FAILURE); 166 153 } 167 - if (stk.ss_flags != 0) { 168 - printf("[FAIL]\tss_flags=%i, should be 0\n", 154 + if (stk.ss_flags != SS_AUTODISARM) { 155 + printf("[FAIL]\tss_flags=%i, should be SS_AUTODISARM\n", 169 156 stk.ss_flags); 170 157 exit(EXIT_FAILURE); 171 158 } 172 - printf("[OK]\tsigaltstack is enabled after signal\n"); 159 + printf("[OK]\tsigaltstack is still SS_AUTODISARM after signal\n"); 173 160 174 161 printf("[OK]\tTest passed\n"); 175 162 return 0;