From: Russell Bryant Date: Fri, 27 Oct 2006 17:36:07 +0000 (+0000) Subject: We should always be using _exit() after a fork() or vfork() instead of exit(). X-Git-Tag: 1.2.14~99 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bf20deeba18e5084dea28d16d375a088e0374a74;p=thirdparty%2Fasterisk.git 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 --- diff --git a/apps/app_externalivr.c b/apps/app_externalivr.c index 5d27f9b3cb..fc5f34082f 100644 --- a/apps/app_externalivr.c +++ b/apps/app_externalivr.c @@ -324,7 +324,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/asterisk.c b/asterisk.c index 9cfdc565d5..bc15eb5c7d 100644 --- a/asterisk.c +++ b/asterisk.c @@ -449,7 +449,7 @@ int ast_safe_system(const char *s) 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); diff --git a/res/res_agi.c b/res/res_agi.c index de4c7be393..56ab7bf422 100644 --- a/res/res_agi.c +++ b/res/res_agi.c @@ -297,7 +297,7 @@ static int launch_script(char *script, char *argv[], int *fds, int *efd, int *op /* 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 */ @@ -308,7 +308,7 @@ static int launch_script(char *script, char *argv[], int *fds, int *efd, int *op 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); diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c index b005cd765a..9972889f89 100644 --- a/res/res_musiconhold.c +++ b/res/res_musiconhold.c @@ -463,7 +463,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]);