We should always be using _exit() after a fork() or vfork() instead of exit().

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
This commit is contained in:
Russell Bryant
2006-10-27 17:36:07 +00:00
parent dc0cb27752
commit bf20deeba1
4 changed files with 5 additions and 5 deletions

View File

@@ -324,7 +324,7 @@ static int app_exec(struct ast_channel *chan, void *data)
close(i); close(i);
execv(argv[0], argv); execv(argv[0], argv);
fprintf(stderr, "Failed to execute '%s': %s\n", argv[0], strerror(errno)); fprintf(stderr, "Failed to execute '%s': %s\n", argv[0], strerror(errno));
exit(1); _exit(1);
} else { } else {
/* parent process */ /* parent process */
int child_events_fd = child_stdin[1]; int child_events_fd = child_stdin[1];

View File

@@ -449,7 +449,7 @@ int ast_safe_system(const char *s)
for (x = STDERR_FILENO + 1; x < 4096; x++) for (x = STDERR_FILENO + 1; x < 4096; x++)
close(x); close(x);
execl("/bin/sh", "/bin/sh", "-c", s, NULL); execl("/bin/sh", "/bin/sh", "-c", s, NULL);
exit(1); _exit(1);
} else if (pid > 0) { } else if (pid > 0) {
for(;;) { for(;;) {
res = wait4(pid, &status, 0, &rusage); res = wait4(pid, &status, 0, &rusage);

View File

@@ -297,7 +297,7 @@ static int launch_script(char *script, char *argv[], int *fds, int *efd, int *op
/* unblock important signal handlers */ /* unblock important signal handlers */
if (sigfillset(&signal_set) || pthread_sigmask(SIG_UNBLOCK, &signal_set, NULL)) { 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)); 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 */ /* Close everything but stdin/out/error */
@@ -308,7 +308,7 @@ static int launch_script(char *script, char *argv[], int *fds, int *efd, int *op
execv(script, argv); execv(script, argv);
/* Can't use ast_log since FD's are closed */ /* Can't use ast_log since FD's are closed */
fprintf(stderr, "Failed to execute '%s': %s\n", script, strerror(errno)); fprintf(stderr, "Failed to execute '%s': %s\n", script, strerror(errno));
exit(1); _exit(1);
} }
if (option_verbose > 2) if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Launched AGI Script %s\n", script); ast_verbose(VERBOSE_PREFIX_3 "Launched AGI Script %s\n", script);

View File

@@ -463,7 +463,7 @@ static int spawn_mp3(struct mohclass *class)
} }
ast_log(LOG_WARNING, "Exec failed: %s\n", strerror(errno)); ast_log(LOG_WARNING, "Exec failed: %s\n", strerror(errno));
close(fds[1]); close(fds[1]);
exit(1); _exit(1);
} else { } else {
/* Parent */ /* Parent */
close(fds[1]); close(fds[1]);