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 (altstack1)
     15  - call sigaltstack() to define the alternate signal stack
     16  - raise SIGTOTEST
     17  - Inside the handler, try to change the alternate signal stack to altstack2, and verify
     18    that the attempt fails.
     19 */
     20 
     21 
     22 #include <signal.h>
     23 #include <stdio.h>
     24 #include <stdlib.h>
     25 #include "posixtest.h"
     26 
     27 #define SIGTOTEST SIGUSR1
     28 
     29 static stack_t altstack1;
     30 
     31 void handler()
     32 {
     33 	stack_t altstack2;
     34 
     35 	if ((altstack2.ss_sp = malloc(SIGSTKSZ)) == NULL) {
     36 		perror
     37 		    ("Unexpected error while attempting to setup test pre-conditions");
     38 		exit(PTS_UNRESOLVED);
     39 	}
     40 
     41 	altstack2.ss_flags = 0;
     42 	altstack2.ss_size = SIGSTKSZ;
     43 
     44 	if (sigaltstack(&altstack2, NULL) != -1) {
     45 		printf
     46 		    ("Test FAILED: Attempt to set change alternate stack while inside handler succeeded.\n");
     47 		exit(PTS_FAIL);
     48 	}
     49 }
     50 
     51 int main(void)
     52 {
     53 
     54 	struct sigaction act;
     55 	act.sa_flags = SA_ONSTACK;
     56 	act.sa_handler = handler;
     57 	sigemptyset(&act.sa_mask);
     58 
     59 	if (sigaction(SIGTOTEST, &act, 0) == -1) {
     60 		perror
     61 		    ("Unexpected error while attempting to setup test pre-conditions");
     62 		return PTS_UNRESOLVED;
     63 	}
     64 
     65 	if ((altstack1.ss_sp = malloc(SIGSTKSZ)) == NULL) {
     66 		perror
     67 		    ("Unexpected error while attempting to setup test pre-conditions");
     68 		return PTS_UNRESOLVED;
     69 	}
     70 
     71 	altstack1.ss_flags = 0;
     72 	altstack1.ss_size = SIGSTKSZ;
     73 
     74 	if (sigaltstack(&altstack1, NULL) == -1) {
     75 		perror
     76 		    ("Unexpected error while attempting to setup test pre-conditions");
     77 		return PTS_UNRESOLVED;
     78 	}
     79 
     80 	if (raise(SIGTOTEST) == -1) {
     81 		perror
     82 		    ("Unexpected error while attempting to setup test pre-conditions");
     83 		return PTS_UNRESOLVED;
     84 	}
     85 
     86 	printf("Test PASSED\n");
     87 	return PTS_PASS;
     88 }
     89