Move the spawn of astcanary down, until after the call to daemon(3).
authorTilghman Lesher <tilghman@meg.abyt.es>
Mon, 18 May 2009 19:17:15 +0000 (19:17 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Mon, 18 May 2009 19:17:15 +0000 (19:17 +0000)
This avoids possible conflicts with the internal implementation of
daemon(3).
(closes issue #15093)
 Reported by: tzafrir
 Patches:
       20090513__issue15093__2.diff.txt uploaded by tilghman (license 14)
 Tested by: tzafrir

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@195320 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/asterisk.c

index 9841c94..744ed29 100644 (file)
@@ -3304,57 +3304,6 @@ int main(int argc, char *argv[])
 
        if (isroot) {
                ast_set_priority(ast_opt_high_priority);
-               if (ast_opt_high_priority) {
-                       int cpipe[2];
-
-                       /* PIPE signal ensures that astcanary dies when Asterisk dies */
-                       if (pipe(cpipe)) {
-                               fprintf(stderr, "Unable to open pipe for canary process: %s\n", strerror(errno));
-                               exit(1);
-                       }
-                       canary_pipe = cpipe[0];
-
-                       snprintf(canary_filename, sizeof(canary_filename), "%s/alt.asterisk.canary.tweet.tweet.tweet", ast_config_AST_RUN_DIR);
-
-                       /* Don't let the canary child kill Asterisk, if it dies immediately */
-                       signal(SIGPIPE, SIG_IGN);
-
-                       canary_pid = fork();
-                       if (canary_pid == 0) {
-                               char canary_binary[128], *lastslash;
-                               int fd;
-
-                               /* Reset signal handler */
-                               signal(SIGCHLD, SIG_DFL);
-                               signal(SIGPIPE, SIG_DFL);
-
-                               dup2(cpipe[1], 100);
-                               close(cpipe[1]);
-
-                               for (fd = 0; fd < 100; fd++) {
-                                       close(fd);
-                               }
-
-                               execlp("astcanary", "astcanary", canary_filename, (char *)NULL);
-
-                               /* If not found, try the same path as used to execute asterisk */
-                               ast_copy_string(canary_binary, argv[0], sizeof(canary_binary));
-                               if ((lastslash = strrchr(canary_binary, '/'))) {
-                                       ast_copy_string(lastslash + 1, "astcanary", sizeof(canary_binary) + canary_binary - (lastslash + 1));
-                                       execl(canary_binary, "astcanary", canary_filename, (char *)NULL);
-                               }
-
-                               /* Should never happen */
-                               _exit(1);
-                       } else if (canary_pid > 0) {
-                               pthread_t dont_care;
-                               close(cpipe[1]);
-                               ast_pthread_create_detached(&dont_care, NULL, canary_thread, NULL);
-                       }
-
-                       /* Kill the canary when we exit */
-                       atexit(canary_exit);
-               }
        }
 
        if (isroot && rungroup) {
@@ -3531,6 +3480,56 @@ int main(int argc, char *argv[])
        }
 #endif
 
+       /* Spawning of astcanary must happen AFTER the call to daemon(3) */
+       if (isroot && ast_opt_high_priority) {
+               int cpipe[2];
+
+               /* PIPE signal ensures that astcanary dies when Asterisk dies */
+               if (pipe(cpipe)) {
+                       fprintf(stderr, "Unable to open pipe for canary process: %s\n", strerror(errno));
+                       exit(1);
+               }
+               canary_pipe = cpipe[0];
+
+               snprintf(canary_filename, sizeof(canary_filename), "%s/alt.asterisk.canary.tweet.tweet.tweet", ast_config_AST_RUN_DIR);
+
+               /* Don't let the canary child kill Asterisk, if it dies immediately */
+               signal(SIGPIPE, SIG_IGN);
+
+               canary_pid = fork();
+               if (canary_pid == 0) {
+                       char canary_binary[128], *lastslash;
+
+                       /* Reset signal handler */
+                       signal(SIGCHLD, SIG_DFL);
+                       signal(SIGPIPE, SIG_DFL);
+
+                       dup2(cpipe[1], 0);
+                       close(cpipe[1]);
+                       ast_close_fds_above_n(0);
+                       ast_set_priority(0);
+
+                       execlp("astcanary", "astcanary", canary_filename, (char *)NULL);
+
+                       /* If not found, try the same path as used to execute asterisk */
+                       ast_copy_string(canary_binary, argv[0], sizeof(canary_binary));
+                       if ((lastslash = strrchr(canary_binary, '/'))) {
+                               ast_copy_string(lastslash + 1, "astcanary", sizeof(canary_binary) + canary_binary - (lastslash + 1));
+                               execl(canary_binary, "astcanary", canary_filename, (char *)NULL);
+                       }
+
+                       /* Should never happen */
+                       _exit(1);
+               } else if (canary_pid > 0) {
+                       pthread_t dont_care;
+                       close(cpipe[1]);
+                       ast_pthread_create_detached(&dont_care, NULL, canary_thread, NULL);
+               }
+
+               /* Kill the canary when we exit */
+               atexit(canary_exit);
+       }
+
        if (ast_event_init()) {
                printf("%s", term_quit());
                exit(1);