]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Fix a signal race when daemonising.
authorRoy Marples <roy@marples.name>
Mon, 26 May 2008 19:19:11 +0000 (19:19 +0000)
committerRoy Marples <roy@marples.name>
Mon, 26 May 2008 19:19:11 +0000 (19:19 +0000)
client.c
signals.c
signals.h

index 07bed64c37485ebb5fcf02bf03781534431fdd32..9342a43b6cc0b3d9780cc26c42129ff470ff9808 100644 (file)
--- 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. */
index d8c7a7e91f107f28ca1a2a04fe1e33a1ba7d9748..0cf590232f3ecb00519c83a97903ae9118b0698b 100644 (file)
--- 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);
 }
index 948099d2a8557569900a7bad36f99f634882c858..6101b7280e8558f93490f313399a8fc225cb8da1 100644 (file)
--- 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 *);