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 
     27 #include <stdio.h>
     28 #include <stdlib.h>
     29 #include <limits.h>
     30 #include <unistd.h>
     31 #include <string.h>
     32 #include <errno.h>
     33 #include <signal.h>
     34 #include "posixtest.h"
     35 
     36 static stack_t a;
     37 
     38 int main(int argc, char *argv[])
     39 {
     40 	int rc;
     41 	char path[PATH_MAX + 1];
     42 
     43 	/* Called with no args, do the exec, otherwise check.  */
     44 	if (argc == 1) {
     45 		a.ss_flags = 0;
     46 		a.ss_size = SIGSTKSZ;
     47 		a.ss_sp = malloc(SIGSTKSZ);
     48 		if (!a.ss_sp) {
     49 			printf("Failed: malloc(SIGSTKSZ) == NULL\n");
     50 			exit(PTS_UNRESOLVED);
     51 		}
     52 
     53 		rc = sigaltstack(&a, NULL);
     54 		if (rc) {
     55 			printf("Failed: sigaltstack() rc: %d errno: %s\n",
     56 			       rc, strerror(errno));
     57 			exit(PTS_UNRESOLVED);
     58 		}
     59 
     60 		/* Get abs path if needed and exec ourself */
     61 		if (*argv[0] != '/') {
     62 			getcwd(path, PATH_MAX);
     63 			strcat(path, "/");
     64 			strcat(path, argv[0]);
     65 		} else {
     66 			strcpy(path, argv[0]);
     67 		}
     68 		execl(path, argv[0], "verify", NULL);
     69 		printf("Failed: execl() errno: %s\n", strerror(errno));
     70 		exit(PTS_UNRESOLVED);
     71 
     72 	} else if (strcmp(argv[1], "verify")) {
     73 		printf("Failed: %s called with unexpected argument: %s\n",
     74 		       argv[0], argv[1]);
     75 		exit(PTS_UNRESOLVED);
     76 	}
     77 
     78 	/* Verify the alt stack is disabled */
     79 	rc = sigaltstack(NULL, &a);
     80 	if (rc || a.ss_flags != SS_DISABLE) {
     81 		printf("Failed: sigaltstack() rc: %d ss_flags: %u\n",
     82 		       rc, a.ss_flags);
     83 		exit(PTS_FAIL);
     84 	}
     85 
     86 	printf("Test PASSED\n");
     87 	return PTS_PASS;
     88 }
     89