Home | History | Annotate | Download | only in sigaltstack
      1 /*
      2  *   Copyright (c) Novell Inc. 2011
      3  *
      4  *   This program is free software;  you can redistribute it and/or modify
      5  *   it under the terms in version 2 of the GNU General Public License as
      6  *   published by the Free Software Foundation.
      7  *
      8  *   This program is distributed in the hope that it will be useful,
      9  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
     10  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     11  *   the GNU General Public License for more details.
     12  *
     13  *   You should have received a copy of the GNU General Public License
     14  *   along with this program;  if not, write to the Free Software
     15  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     16  *
     17  *   Author:  Peter W. Morreale <pmorreale AT novell DOT com>
     18  *   Date:    09.07.2011
     19  *
     20  *
     21  * Test assertion 9-1 - Prove that an established alternate signal stack
     22  * is not available after an exec.
     23  *
     24  */
     25 
     26 #define _XOPEN_SOURCE 600
     27 
     28 #include <stdio.h>
     29 #include <stdlib.h>
     30 #include <limits.h>
     31 #include <unistd.h>
     32 #include <string.h>
     33 #include <errno.h>
     34 #include <signal.h>
     35 #include "posixtest.h"
     36 
     37 static stack_t a;
     38 
     39 int main(int argc, char *argv[])
     40 {
     41 	int rc;
     42 	char path[PATH_MAX + 1];
     43 
     44 	/* Called with no args, do the exec, otherwise check.  */
     45 	if (argc == 1) {
     46 		a.ss_flags = 0;
     47 		a.ss_size = SIGSTKSZ;
     48 		a.ss_sp = malloc(SIGSTKSZ);
     49 		if (!a.ss_sp) {
     50 			printf("Failed: malloc(SIGSTKSZ) == NULL\n");
     51 			exit(PTS_UNRESOLVED);
     52 		}
     53 
     54 		rc = sigaltstack(&a, NULL);
     55 		if (rc) {
     56 			printf("Failed: sigaltstack() rc: %d errno: %s\n",
     57 			       rc, strerror(errno));
     58 			exit(PTS_UNRESOLVED);
     59 		}
     60 
     61 		/* Get abs path if needed and exec ourself */
     62 		if (*argv[0] != '/') {
     63 			getcwd(path, PATH_MAX);
     64 			strcat(path, "/");
     65 			strcat(path, argv[0]);
     66 		} else {
     67 			strcpy(path, argv[0]);
     68 		}
     69 		execl(path, argv[0], "verify", NULL);
     70 		printf("Failed: execl() errno: %s\n", strerror(errno));
     71 		exit(PTS_UNRESOLVED);
     72 
     73 	} else if (strcmp(argv[1], "verify")) {
     74 		printf("Failed: %s called with unexpected argument: %s\n",
     75 		       argv[0], argv[1]);
     76 		exit(PTS_UNRESOLVED);
     77 	}
     78 
     79 	/* Verify the alt stack is disabled */
     80 	rc = sigaltstack(NULL, &a);
     81 	if (rc || a.ss_flags != SS_DISABLE) {
     82 		printf("Failed: sigaltstack() rc: %d ss_flags: %u\n",
     83 		       rc, a.ss_flags);
     84 		exit(PTS_FAIL);
     85 	}
     86 
     87 	printf("Test PASSED\n");
     88 	return PTS_PASS;
     89 }
     90