From 0ea88fa418c5133f8add1c2eabdd3369942cc77e Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Wed, 4 Feb 2009 22:27:29 +0100 Subject: [PATCH] Ignore SIGUSR1 before forking the afs process. Otherwise, afs might get killed by SIGUSR1 before it gets a chance to ignore this signal. --- afs.c | 4 ---- server.c | 14 ++++++++++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/afs.c b/afs.c index fd705b1f..f4a44bbb 100644 --- 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); diff --git a/server.c b/server.c index 9187b63f..9c069913 100644 --- 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(); -- 2.39.5