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