03.05.2016 20:31, Andy Lutomirski пишет:
The handling for old kernels was wrong. Fix it.
Reported-by: Ingo Molnar <mi...@kernel.org>
Cc: Stas Sergeev <s...@list.ru>
Cc: Al Viro <v...@zeniv.linux.org.uk>
Cc: Andrew Morton <a...@linux-foundation.org>
Cc: Andy Lutomirski <l...@amacapital.net>
Cc: Borislav Petkov <b...@alien8.de>
Cc: Brian Gerst <brge...@gmail.com>
Cc: Denys Vlasenko <dvlas...@redhat.com>
Cc: H. Peter Anvin <h...@zytor.com>
Cc: Linus Torvalds <torva...@linux-foundation.org>
Cc: Oleg Nesterov <o...@redhat.com>
Cc: Pavel Emelyanov <xe...@parallels.com>
Cc: Peter Zijlstra <pet...@infradead.org>
Cc: Shuah Khan <shua...@osg.samsung.com>
Cc: Thomas Gleixner <t...@linutronix.de>
Cc: linux-...@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Andy Lutomirski <l...@kernel.org>
---
tools/testing/selftests/sigaltstack/sas.c | 21 ++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)
diff --git a/tools/testing/selftests/sigaltstack/sas.c
b/tools/testing/selftests/sigaltstack/sas.c
index 57da8bfde60b..a98c3ef8141f 100644
--- a/tools/testing/selftests/sigaltstack/sas.c
+++ b/tools/testing/selftests/sigaltstack/sas.c
@@ -15,6 +15,7 @@
#include <alloca.h>
#include <string.h>
#include <assert.h>
+#include <errno.h>
#ifndef SS_AUTODISARM
#define SS_AUTODISARM (1 << 4)
@@ -117,13 +118,19 @@ int main(void)
stk.ss_flags = SS_ONSTACK | SS_AUTODISARM;
err = sigaltstack(&stk, NULL);
if (err) {
- perror("[FAIL]\tsigaltstack(SS_ONSTACK | SS_AUTODISARM)");
- stk.ss_flags = SS_ONSTACK;
- }
- err = sigaltstack(&stk, NULL);
- if (err) {
- perror("[FAIL]\tsigaltstack(SS_ONSTACK)");
- return EXIT_FAILURE;
+ if (errno == EINVAL) {
+ printf("[NOTE]\tThe running kernel doesn't support
SS_AUTODISARM\n");
+ /*
+ * If test cases for the !SS_AUTODISARM variant were
+ * added, we could still run them. We don't have any
+ * test cases like that yet, so just exit and report
+ * success.
+ */
But that was the point, please see how it handles the
old kernels:
$ ./sas
[FAIL] sigaltstack(SS_ONSTACK | SS_AUTODISARM): Invalid argument
[RUN] signal USR1
[FAIL] ss_flags=1, should be SS_DISABLE
[RUN] switched to user ctx
[RUN] signal USR2
[FAIL] sigaltstack re-used
[FAIL] Stack corrupted
[RUN] Aborting
Unfortunalely, for Ingo it crashed...
I am not sure why, I can't reproduce. :(
So if you disable all the "old" tests, you can as well
remove them, or... find the bug and re-enable. :)