From: Roy Marples Date: Mon, 26 May 2008 19:19:11 +0000 (+0000) Subject: Fix a signal race when daemonising. X-Git-Tag: v4.0.2~331 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e0496aa9eb35c9006f105e5db6bb8d27270c0c25;p=thirdparty%2Fdhcpcd.git Fix a signal race when daemonising. --- diff --git a/client.c b/client.c index 07bed64c..9342a43b 100644 --- a/client.c +++ b/client.c @@ -164,6 +164,8 @@ daemonise(struct if_state *state, const struct options *options) case 0: setsid(); close_fds(); + /* Clear pending signals */ + signal_clear(); break; default: /* Reset signals as we're the parent about to exit. */ diff --git a/signals.c b/signals.c index d8c7a7e9..0cf59023 100644 --- a/signals.c +++ b/signals.c @@ -134,30 +134,36 @@ signal_init(void) } static int -signal_handle(void (*func)(int)) +signal_handle(void (*func)(int), int restore) { unsigned int i; - struct sigaction sa; + struct sigaction sa, sa_old; memset(&sa, 0, sizeof(sa)); sa.sa_handler = func; sigemptyset(&sa.sa_mask); for (i = 0; i < sizeof(handle_sigs) / sizeof(handle_sigs[0]); i++) - if (sigaction(handle_sigs[i], &sa, NULL) == -1) + if (sigaction(handle_sigs[i], &sa, &sa_old) == -1) return -1; - + if (restore && sigaction(handle_sigs[i], &sa_old, NULL) == -1) + return -1; return 0; } int signal_setup(void) { - return signal_handle(signal_handler); + return signal_handle(signal_handler, 0); } int signal_reset(void) { - return signal_handle(SIG_DFL); + return signal_handle(SIG_DFL, 0); +} + +int +signal_clear(void) + return signal_handle(SIG_IGN, 1); } diff --git a/signals.h b/signals.h index 948099d2..6101b728 100644 --- a/signals.h +++ b/signals.h @@ -33,6 +33,7 @@ int signal_init(void); int signal_setup(void); int signal_reset(void); +int signal_clear(void); int signal_fd(void); int signal_exists(const struct pollfd *); int signal_read(struct pollfd *);