Home | History | Annotate | Download | only in sigaltstack
      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 that the ss_flags member of the obtained alternate signal stack is SS_DISABLE.
     19 */
     20 
     21 #define _XOPEN_SOURCE 600
     22 
     23 #include <signal.h>
     24 #include <stdio.h>
     25 #include <stdlib.h>
     26 #include "posixtest.h"
     27 
     28 #define SIGTOTEST SIGUSR1
     29 
     30 static stack_t alternate_s;
     31 
     32 void handler()
     33 {
     34 	stack_t handler_s;
     35 
     36 	if (sigaltstack(NULL, &handler_s) == -1) {
     37 		perror
     38 		    ("Unexpected error while attempting to setup test pre-conditions");
     39 		exit(PTS_UNRESOLVED);
     40 	}
     41 
     42 	if (handler_s.ss_flags != SS_DISABLE) {
     43 		printf
     44 		    ("Test FAILED: The alternate stack's ss_flags member does not contain SS_DISABLE even though the alternate signal stack is disabled.\n");
     45 		exit(PTS_FAIL);
     46 	}
     47 }
     48 
     49 int main(void)
     50 {
     51 
     52 	struct sigaction act;
     53 	act.sa_flags = SA_ONSTACK;
     54 	act.sa_handler = handler;
     55 	sigemptyset(&act.sa_mask);
     56 
     57 	if (sigaction(SIGTOTEST, &act, 0) == -1) {
     58 		perror
     59 		    ("Unexpected error while attempting to setup test pre-conditions");
     60 		return PTS_UNRESOLVED;
     61 	}
     62 
     63 	if ((alternate_s.ss_sp = malloc(SIGSTKSZ)) == NULL) {
     64 		perror
     65 		    ("Unexpected error while attempting to setup test pre-conditions");
     66 		return PTS_UNRESOLVED;
     67 	}
     68 
     69 	alternate_s.ss_flags = SS_DISABLE;
     70 	alternate_s.ss_size = SIGSTKSZ;
     71 
     72 	if (sigaltstack(&alternate_s, NULL) == -1) {
     73 		perror
     74 		    ("Unexpected error while attempting to setup test pre-conditions");
     75 		return PTS_UNRESOLVED;
     76 	}
     77 
     78 	if (raise(SIGTOTEST) == -1) {
     79 		perror
     80 		    ("Unexpected error while attempting to setup test pre-conditions");
     81 		return PTS_UNRESOLVED;
     82 	}
     83 
     84 	printf("Test PASSED\n");
     85 	return PTS_PASS;
     86 }
     87