This is because exit() does some extra cleanup which in some implementations
of vfork(), for example, can actually modify the state of the parent process,
causing very weird bugs or crashes. (issue #7971, Nick Gavrikov)
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2@46361
65c4cc65-6c06-0410-ace0-
fbb531ad65f3
close(i);
execv(argv[0], argv);
fprintf(stderr, "Failed to execute '%s': %s\n", argv[0], strerror(errno));
- exit(1);
+ _exit(1);
} else {
/* parent process */
int child_events_fd = child_stdin[1];
for (x = STDERR_FILENO + 1; x < 4096; x++)
close(x);
execl("/bin/sh", "/bin/sh", "-c", s, NULL);
- exit(1);
+ _exit(1);
} else if (pid > 0) {
for(;;) {
res = wait4(pid, &status, 0, &rusage);
/* unblock important signal handlers */
if (sigfillset(&signal_set) || pthread_sigmask(SIG_UNBLOCK, &signal_set, NULL)) {
ast_log(LOG_WARNING, "unable to unblock signals for AGI script: %s\n", strerror(errno));
- exit(1);
+ _exit(1);
}
/* Close everything but stdin/out/error */
execv(script, argv);
/* Can't use ast_log since FD's are closed */
fprintf(stderr, "Failed to execute '%s': %s\n", script, strerror(errno));
- exit(1);
+ _exit(1);
}
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Launched AGI Script %s\n", script);
}
ast_log(LOG_WARNING, "Exec failed: %s\n", strerror(errno));
close(fds[1]);
- exit(1);
+ _exit(1);
} else {
/* Parent */
close(fds[1]);