selftests/sigaltstack: Fix the sigaltstack test on old kernels
authorAndy Lutomirski <[email protected]>
Tue, 3 May 2016 17:31:50 +0000 (10:31 -0700)
committerIngo Molnar <[email protected]>
Wed, 4 May 2016 06:34:13 +0000 (08:34 +0200)
The handling for old kernels was wrong, resulting in a segfault.  Fix it.

Reported-by: Ingo Molnar <[email protected]>
Signed-off-by: Andy Lutomirski <[email protected]>
Cc: Al Viro <[email protected]>
Cc: Andrew Morton <[email protected]>
Cc: Andy Lutomirski <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: Brian Gerst <[email protected]>
Cc: Denys Vlasenko <[email protected]>
Cc: H. Peter Anvin <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Oleg Nesterov <[email protected]>
Cc: Pavel Emelyanov <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Shuah Khan <[email protected]>
Cc: Stas Sergeev <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: [email protected]
Link: http://lkml.kernel.org/r/f3e739bf435beeaecbd5f038f1359d2eac6d1e63.1462296606.git.luto@kernel.org
Signed-off-by: Ingo Molnar <[email protected]>
tools/testing/selftests/sigaltstack/sas.c

index 57da8bfde60b5e406c99f8c8b20a5411ce464d0e..a98c3ef8141f1666aa1ea2842b0853dd1a21efff 100644 (file)
@@ -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.
+                        */
+                       return 0;
+               } else {
+                       perror("[FAIL]\tsigaltstack(SS_ONSTACK | SS_AUTODISARM)");
+                       return EXIT_FAILURE;
+               }
        }
 
        ustack = mmap(NULL, SIGSTKSZ, PROT_READ | PROT_WRITE,