]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
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 5d2ba1f65cf1df3a38cebb741780b264872f03dd..f9b8905884c130721b280de3b4f6394a91495a4c 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 44bea2812acb4e85e8323d0069aff289a7b2e9b9..9ac742de720d447b082cb0d0c7e4f169d99e33e1 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 686b17ddd29a877a5d0ebd0a262067017e10eb25..bbb1dc8a96025a2a811e822539db30c6c4c9febd 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 a8b4d62e8002b8e841fcd5b1b82875f9b7b222ce..44cc5498f0eaf6812f0ed87658ba079cd98282d3 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]);