1 /*
2 
3  * Copyright (c) 2002-2003, Intel Corporation. All rights reserved.
4  * Created by:  rusty.lynch REMOVE-THIS AT intel DOT com
5  * This file is licensed under the GPL license.  For the full content
6  * of this license, see the COPYING file at the top level of this
7  * source tree.
8 
9   Test case for assertion #12 of the sigaction system call that verifies
10   signal-catching functions are executed on the alternate stack if the
11   SA_ONSTACK flag is set in the sigaction.sa_flags parameter to the
12   sigaction function call, and an alternate stack has been setup with
13   sigaltstack().
14 
15   NOTE: This test case does not attempt to verify the proper operation
16         of sigaltstack.
17 */
18 
19 #define _XOPEN_SOURCE 600
20 
21 #include <signal.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include "posixtest.h"
25 
26 stack_t alt_ss;
27 
handler(int signo)28 void handler(int signo)
29 {
30 	stack_t ss;
31 
32 	printf("Caught SIGTSTP\n");
33 
34 	if (sigaltstack((stack_t *)0, &ss) == -1) {
35 		perror("Unexpected error while attempting to setup test "
36 		       "pre-conditions");
37 		exit(-1);
38 	}
39 
40 	if (ss.ss_sp != alt_ss.ss_sp || ss.ss_size != alt_ss.ss_size) {
41 		printf("Test FAILED\n");
42 		exit(-1);
43 	}
44 }
45 
main()46 int main()
47 {
48 	struct sigaction act;
49 
50 	act.sa_handler = handler;
51 	act.sa_flags = SA_ONSTACK;
52 	sigemptyset(&act.sa_mask);
53 	if (sigaction(SIGTSTP,  &act, 0) == -1) {
54 		perror("Unexpected error while attempting to setup test "
55 		       "pre-conditions");
56 		return PTS_UNRESOLVED;
57 	}
58 
59 	if ((alt_ss.ss_sp = (void *)malloc(SIGSTKSZ)) == NULL) {
60 		perror("Unexpected error while attempting to setup test "
61 		       "pre-conditions");
62 		return PTS_UNRESOLVED;
63 	}
64 	alt_ss.ss_size = SIGSTKSZ;
65 	alt_ss.ss_flags = 0;
66 
67 	if (sigaltstack(&alt_ss, (stack_t *)0) == -1) {
68 		perror("Unexpected error while attempting to setup test "
69 		       "pre-conditions");
70 		return PTS_UNRESOLVED;
71 	}
72 
73 	if (raise(SIGTSTP) == -1) {
74 		perror("Unexpected error while attempting to setup test "
75 		       "pre-conditions");
76 		return PTS_UNRESOLVED;
77 	}
78 
79 	printf("Test PASSED\n");
80 	return PTS_PASS;
81 }
82 
83