Merged revisions 46363 via svnmerge from
authorRussell Bryant <russell@russellbryant.com>
Fri, 27 Oct 2006 17:42:57 +0000 (17:42 +0000)
committerRussell Bryant <russell@russellbryant.com>
Fri, 27 Oct 2006 17:42:57 +0000 (17:42 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r46363 | russell | 2006-10-27 12:39:31 -0500 (Fri, 27 Oct 2006) | 5 lines

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/trunk@46364 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_externalivr.c
main/asterisk.c
res/res_agi.c
res/res_musiconhold.c

index 5d2ba1f..f9b8905 100644 (file)
@@ -323,7 +323,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];
index 44bea28..9ac742d 100644 (file)
@@ -668,7 +668,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);
index 686b17d..bbb1dc8 100644 (file)
@@ -319,7 +319,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 */
@@ -332,7 +332,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);
index a8b4d62..44cc549 100644 (file)
@@ -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]);