1 /*
2  * Copyright (c) 2002-2003, Intel Corporation. All rights reserved.
3  * Created by:  salwan.searty REMOVE-THIS AT intel DOT com
4  * This file is licensed under the GPL license.  For the full content
5  * of this license, see the COPYING file at the top level of this
6  * source tree.
7 
8  This program tests the assertion that if the ss_flags member is not set to SS_DISABLE,
9  the stack shall be enabled, and the ss_sp and ss_size members specify the new address
10  and size of the stack.
11 
12  Steps:
13  - Set up a handler for signal SIGTOTEST and set the sa_flags member to SA_ONSTACK.
14  - Allocate memory for the alternate signal stack
15  - call sigaltstack() to define the alternate signal stack
16  - raise SIGTOTEST
17  - Inside the handler, use sigaltstack to examine/obtain the current alternate signal
18    stack and verify:
19    1. The ss_sp member of the obtained alternate signal stack is equal to the ss_sp
20       that we defined in the main() function.
21    2. The ss_size member of the obtained alternate signal stack is equal to the ss_size
22       that we defined in the main() function.
23 */
24 
25 
26 #include <signal.h>
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include "posixtest.h"
30 
31 #define SIGTOTEST SIGUSR1
32 
33 static stack_t alternate_s;
34 
handlernull35 static void handler()
36 {
37 
38 	stack_t handler_s;
39 
40 	if (sigaltstack(NULL, &handler_s) == -1) {
41 		perror
42 		    ("Unexpected error while attempting to setup test pre-conditions");
43 		exit(PTS_UNRESOLVED);
44 	}
45 
46 	if (handler_s.ss_sp != alternate_s.ss_sp) {
47 		printf
48 		    ("Test FAILED: ss_sp of the stack is not same as the defined one\n");
49 		exit(PTS_FAIL);
50 	}
51 
52 	if (handler_s.ss_size != alternate_s.ss_size) {
53 		printf
54 		    ("Test FAILED: ss_size of the stack is not same as the defined one\n");
55 		exit(PTS_FAIL);
56 	}
57 
58 }
59 
main(void)60 int main(void)
61 {
62 
63 	struct sigaction act;
64 	act.sa_flags = SA_ONSTACK;
65 	act.sa_handler = handler;
66 	sigemptyset(&act.sa_mask);
67 
68 	if (sigaction(SIGTOTEST, &act, 0) == -1) {
69 		perror
70 		    ("Unexpected error while attempting to setup test pre-conditions");
71 		return PTS_UNRESOLVED;
72 	}
73 
74 	if ((alternate_s.ss_sp = malloc(SIGSTKSZ)) == NULL) {
75 		perror
76 		    ("Unexpected error while attempting to setup test pre-conditions");
77 		return PTS_UNRESOLVED;
78 	}
79 
80 	alternate_s.ss_flags = 0;
81 	alternate_s.ss_size = SIGSTKSZ;
82 
83 	if (sigaltstack(&alternate_s, NULL) == -1) {
84 		perror
85 		    ("Unexpected error while attempting to setup test pre-conditions");
86 		return PTS_UNRESOLVED;
87 	}
88 
89 	if (raise(SIGTOTEST) == -1) {
90 		perror
91 		    ("Unexpected error while attempting to setup test pre-conditions");
92 		return PTS_UNRESOLVED;
93 	}
94 
95 	printf("Test PASSED\n");
96 	return PTS_PASS;
97 }
98