From d7f9b5f9128672081a3b2c49b23478585c6c1620 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Fri, 27 Oct 2006 17:39:31 +0000 Subject: [PATCH] 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.4@46363 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/app_externalivr.c | 2 +- main/asterisk.c | 2 +- res/res_agi.c | 4 ++-- res/res_musiconhold.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/app_externalivr.c b/apps/app_externalivr.c index 7929a02382..a42dd95512 100644 --- a/apps/app_externalivr.c +++ b/apps/app_externalivr.c @@ -322,7 +322,7 @@ static int app_exec(struct ast_channel *chan, void *data) 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]; diff --git a/main/asterisk.c b/main/asterisk.c index 941d211298..7b7b11ae77 100644 --- a/main/asterisk.c +++ b/main/asterisk.c @@ -715,7 +715,7 @@ int ast_safe_system(const char *s) close(x); #endif execl("/bin/sh", "/bin/sh", "-c", s, (char *) NULL); - exit(1); + _exit(1); } else if (pid > 0) { for(;;) { res = wait4(pid, &status, 0, &rusage); diff --git a/res/res_agi.c b/res/res_agi.c index de9fd31512..7a9677c6c0 100644 --- a/res/res_agi.c +++ b/res/res_agi.c @@ -318,7 +318,7 @@ static enum agi_result launch_script(char *script, char *argv[], int *fds, int * /* 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 */ @@ -330,7 +330,7 @@ static enum agi_result launch_script(char *script, char *argv[], int *fds, int * /* Can't use ast_log since FD's are closed */ fprintf(stdout, "verbose \"Failed to execute '%s': %s\" 2\n", script, strerror(errno)); fflush(stdout); - exit(1); + _exit(1); } if (option_verbose > 2) ast_verbose(VERBOSE_PREFIX_3 "Launched AGI Script %s\n", script); diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c index a4debac8f3..d6832009d8 100644 --- a/res/res_musiconhold.c +++ b/res/res_musiconhold.c @@ -461,7 +461,7 @@ static int spawn_mp3(struct mohclass *class) } ast_log(LOG_WARNING, "Exec failed: %s\n", strerror(errno)); close(fds[1]); - exit(1); + _exit(1); } else { /* Parent */ close(fds[1]);