aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2006-10-27 17:39:31 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2006-10-27 17:39:31 +0000
commit83e66fa60070ea934061f173f1db6d95e461a124 (patch)
treefc7fdf041e5accbca6bc15a56bd5aa9ce6b9a402
parent5cf507d56d6089e6b63eb0780089e797ccff008e (diff)
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: http://svn.digium.com/svn/asterisk/branches/1.4@46363 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--apps/app_externalivr.c2
-rw-r--r--main/asterisk.c2
-rw-r--r--res/res_agi.c4
-rw-r--r--res/res_musiconhold.c2
4 files changed, 5 insertions, 5 deletions
diff --git a/apps/app_externalivr.c b/apps/app_externalivr.c
index 7929a0238..a42dd9551 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 941d21129..7b7b11ae7 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 de9fd3151..7a9677c6c 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 a4debac8f..d6832009d 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]);