]> git.ipfire.org Git - people/ms/strongswan.git/commitdiff
Add compile option to disable internal handling of fatal signals
authorSheena Mira-ato <sheena.mira-ato@alliedtelesis.co.nz>
Thu, 21 Mar 2019 03:28:08 +0000 (16:28 +1300)
committerTobias Brunner <tobias@strongswan.org>
Tue, 28 May 2019 08:44:48 +0000 (10:44 +0200)
By default, charon and its derivatives internally handle the SIGSEGV,
SIGILL, and SIGBUS signals raised by threads (segv_handler).  Add a compile
option so that the signal handling can optionally be done externally.

Closes strongswan/strongswan#132.

src/charon-cmd/charon-cmd.c
src/charon-nm/charon-nm.c
src/charon-systemd/charon-systemd.c
src/charon-tkm/src/charon-tkm.c
src/charon/charon.c

index e85e21d5c7353915e1c5f9ce3bb9d2ce450d3e3c..2bf0fb05e83a760c885162c5b693dbfa38f3bf08 100644 (file)
@@ -174,6 +174,7 @@ static bool lookup_uid_gid()
        return TRUE;
 }
 
+#ifndef DISABLE_SIGNAL_HANDLER
 /**
  * Handle SIGSEGV/SIGILL signals raised by threads
  */
@@ -189,6 +190,7 @@ static void segv_handler(int signal)
        DBG1(DBG_DMN, "killing ourself, received critical signal");
        abort();
 }
+#endif /* DISABLE_SIGNAL_HANDLER */
 
 /**
  * Print command line usage and exit
@@ -372,18 +374,23 @@ int main(int argc, char *argv[])
        /* handle all arguments */
        handle_arguments(argc, argv, FALSE);
 
-       /* add handler for SEGV and ILL,
-        * INT, TERM and HUP are handled by sigwaitinfo() in run() */
-       action.sa_handler = segv_handler;
+       /* add handler for fatal signals,
+        * INT, TERM, HUP and USR1 are handled by sigwaitinfo() in run() */
        action.sa_flags = 0;
        sigemptyset(&action.sa_mask);
        sigaddset(&action.sa_mask, SIGINT);
        sigaddset(&action.sa_mask, SIGTERM);
        sigaddset(&action.sa_mask, SIGHUP);
        sigaddset(&action.sa_mask, SIGUSR1);
+
+       /* optionally let the external system handle fatal signals */
+#ifndef DISABLE_SIGNAL_HANDLER
+       action.sa_handler = segv_handler;
        sigaction(SIGSEGV, &action, NULL);
        sigaction(SIGILL, &action, NULL);
        sigaction(SIGBUS, &action, NULL);
+#endif /* DISABLE_SIGNAL_HANDLER */
+
        action.sa_handler = SIG_IGN;
        sigaction(SIGPIPE, &action, NULL);
 
index 52012e24e7b96c5e637e91e0cf9faeecd0dc8ab9..0134f5a71d8bfce9fde19edd8daca14d09c7a9ed 100644 (file)
@@ -109,6 +109,7 @@ static void run()
        }
 }
 
+#ifndef DISABLE_SIGNAL_HANDLER
 /**
  * Handle SIGSEGV/SIGILL signals raised by threads
  */
@@ -124,6 +125,7 @@ static void segv_handler(int signal)
        DBG1(DBG_DMN, "killing ourself, received critical signal");
        abort();
 }
+#endif /* DISABLE_SIGNAL_HANDLER */
 
 /**
  * Lookup UID and GID
@@ -225,16 +227,21 @@ int main(int argc, char *argv[])
                goto deinit;
        }
 
-       /* add handler for SEGV and ILL,
+       /* add handler for fatal signals,
         * INT and TERM are handled by sigwaitinfo() in run() */
-       action.sa_handler = segv_handler;
        action.sa_flags = 0;
        sigemptyset(&action.sa_mask);
        sigaddset(&action.sa_mask, SIGINT);
        sigaddset(&action.sa_mask, SIGTERM);
+
+       /* optionally let the external system handle fatal signals */
+#ifndef DISABLE_SIGNAL_HANDLER
+       action.sa_handler = segv_handler;
        sigaction(SIGSEGV, &action, NULL);
        sigaction(SIGILL, &action, NULL);
        sigaction(SIGBUS, &action, NULL);
+#endif /* DISABLE_SIGNAL_HANDLER */
+
        action.sa_handler = SIG_IGN;
        sigaction(SIGPIPE, &action, NULL);
 
index 7d4465ebf180142fe4b11b29631fe12a5ca9bd60..009db076c9d5b73ac3ac70d97d07fa28c14a36c1 100644 (file)
@@ -281,6 +281,7 @@ static bool lookup_uid_gid()
        return TRUE;
 }
 
+#ifndef DISABLE_SIGNAL_HANDLER
 /**
  * Handle SIGSEGV/SIGILL signals raised by threads
  */
@@ -297,6 +298,7 @@ static void segv_handler(int signal)
        DBG1(DBG_DMN, "killing ourself, received critical signal");
        abort();
 }
+#endif /* DISABLE_SIGNAL_HANDLER */
 
 /**
  * Add namespace alias
@@ -380,17 +382,22 @@ int main(int argc, char *argv[])
                goto error;
        }
 
-       /* add handler for SEGV and ILL,
+       /* add handler for fatal signals,
         * INT, TERM and HUP are handled by sigwaitinfo() in run() */
-       action.sa_handler = segv_handler;
        action.sa_flags = 0;
        sigemptyset(&action.sa_mask);
        sigaddset(&action.sa_mask, SIGINT);
        sigaddset(&action.sa_mask, SIGTERM);
        sigaddset(&action.sa_mask, SIGHUP);
+
+       /* optionally let the external system handle fatal signals */
+#ifndef DISABLE_SIGNAL_HANDLER
+       action.sa_handler = segv_handler;
        sigaction(SIGSEGV, &action, NULL);
        sigaction(SIGILL, &action, NULL);
        sigaction(SIGBUS, &action, NULL);
+#endif /* DISABLE_SIGNAL_HANDLER */
+
        action.sa_handler = SIG_IGN;
        sigaction(SIGPIPE, &action, NULL);
 
index 57d132406d923309f1d2eeb60c2a8543f8ed6512..c8d5014183c4c5d1522ca1eba54ead7e7e21b600 100644 (file)
@@ -133,6 +133,7 @@ static void run()
        }
 }
 
+#ifndef DISABLE_SIGNAL_HANDLER
 /**
  * Handle SIGSEGV/SIGILL signals raised by threads
  */
@@ -148,6 +149,7 @@ static void segv_handler(int signal)
        DBG1(DBG_DMN, "killing ourself, received critical signal");
        abort();
 }
+#endif /* DISABLE_SIGNAL_HANDLER */
 
 /**
  * Lookup UID and GID
@@ -372,16 +374,21 @@ int main(int argc, char *argv[])
        /* register TKM credential encoder */
        lib->encoding->add_encoder(lib->encoding, tkm_encoder_encode);
 
-       /* add handler for SEGV and ILL,
+       /* add handler for fatal signals,
         * INT and TERM are handled by sigwaitinfo() in run() */
-       action.sa_handler = segv_handler;
        action.sa_flags = 0;
        sigemptyset(&action.sa_mask);
        sigaddset(&action.sa_mask, SIGINT);
        sigaddset(&action.sa_mask, SIGTERM);
+
+       /* optionally let the external system handle fatal signals */
+#ifndef DISABLE_SIGNAL_HANDLER
+       action.sa_handler = segv_handler;
        sigaction(SIGSEGV, &action, NULL);
        sigaction(SIGILL, &action, NULL);
        sigaction(SIGBUS, &action, NULL);
+#endif /* DISABLE_SIGNAL_HANDLER */
+
        action.sa_handler = SIG_IGN;
        sigaction(SIGPIPE, &action, NULL);
 
index 19f6c4cf79c67c5998fef5cd79fe5d7caabc2fed..1d179bae379776c57c0b9416f8fef590bc66afb9 100644 (file)
@@ -167,6 +167,7 @@ static bool lookup_uid_gid()
 /**
  * Handle SIGSEGV/SIGILL signals raised by threads
  */
+#ifndef DISABLE_SIGNAL_HANDLER
 static void segv_handler(int signal)
 {
        backtrace_t *backtrace;
@@ -180,6 +181,7 @@ static void segv_handler(int signal)
        DBG1(DBG_DMN, "killing ourself, received critical signal");
        abort();
 }
+#endif /* DISABLE_SIGNAL_HANDLER */
 
 /**
  * Check/create PID file, return TRUE if already running
@@ -438,17 +440,22 @@ int main(int argc, char *argv[])
                goto deinit;
        }
 
-       /* add handler for SEGV and ILL,
+       /* add handler for fatal signals,
         * INT, TERM and HUP are handled by sigwaitinfo() in run() */
-       action.sa_handler = segv_handler;
        action.sa_flags = 0;
        sigemptyset(&action.sa_mask);
        sigaddset(&action.sa_mask, SIGINT);
        sigaddset(&action.sa_mask, SIGTERM);
        sigaddset(&action.sa_mask, SIGHUP);
+
+       /* optionally let the external system handle fatal signals */
+#ifndef DISABLE_SIGNAL_HANDLER
+       action.sa_handler = segv_handler;
        sigaction(SIGSEGV, &action, NULL);
        sigaction(SIGILL, &action, NULL);
        sigaction(SIGBUS, &action, NULL);
+#endif /* DISABLE_SIGNAL_HANDLER */
+
        action.sa_handler = SIG_IGN;
        sigaction(SIGPIPE, &action, NULL);