Ignore SIGUSR1 before forking the afs process.
authorAndre Noll <maan@systemlinux.org>
Wed, 4 Feb 2009 21:27:29 +0000 (22:27 +0100)
committerAndre Noll <maan@systemlinux.org>
Wed, 4 Feb 2009 21:27:29 +0000 (22:27 +0100)
Otherwise, afs might get killed by SIGUSR1 before it gets a chance
to ignore this signal.

afs.c
server.c

diff --git a/afs.c b/afs.c
index fd705b1..f4a44bb 100644 (file)
--- a/afs.c
+++ b/afs.c
@@ -809,10 +809,6 @@ static void register_signal_task(void)
                PARA_EMERG_LOG("failed to ignore SIGPIPE\n");
                exit(EXIT_FAILURE);
        }
-       if (signal(SIGUSR1, SIG_IGN) == SIG_ERR) {
-               PARA_EMERG_LOG("failed to ignore SIGUSR1\n");
-               exit(EXIT_FAILURE);
-       }
        st->fd = para_signal_init();
        PARA_INFO_LOG("signal pipe: fd %d\n", st->fd);
        para_install_sighandler(SIGINT);
index 9187b63..9c06991 100644 (file)
--- a/server.c
+++ b/server.c
@@ -328,8 +328,6 @@ static void init_signal_task(void)
                goto err;
        if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
                goto err;
-       if (signal(SIGUSR1, SIG_IGN) == SIG_ERR)
-               goto err;
        add_close_on_fork_list(st->fd);
        register_task(&st->task);
        return;
@@ -499,6 +497,18 @@ static void server_init(int argc, char **argv)
                daemonize();
        PARA_NOTICE_LOG("initializing audio format handlers\n");
        afh_init();
+
+       /*
+        * Although afs uses its own signal handling we must ignore SIGUSR1
+        * _before_ the afs child process gets born by init_afs() below.  It's
+        * racy to do this in the child because the parent might send SIGUSR1
+        * before the child gets a chance to ignore this signal -- only the
+        * good die young.
+        */
+       if (signal(SIGUSR1, SIG_IGN) == SIG_ERR) {
+               PARA_EMERG_LOG("failed to ignore SIGUSR1\n");
+               exit(EXIT_FAILURE);
+       }
        PARA_NOTICE_LOG("initializing the audio file selector\n");
        afs_socket = init_afs();
        init_signal_task();