aboutsummaryrefslogtreecommitdiffstats
path: root/src/vlib/unix/main.c
diff options
context:
space:
mode:
authorDave Barach <dave@barachs.net>2017-10-13 19:16:56 -0400
committerFlorin Coras <florin.coras@gmail.com>2017-10-16 02:33:49 +0000
commit84db40e02e74efabe094e0d46ed2fafd348d126d (patch)
treeacb97b6c2274bfdb45770347a6033b68ebff0545 /src/vlib/unix/main.c
parentb5518bedd95bea9c30cebcd5b0db76bd00f30a80 (diff)
VPP-1029: Don't call clib_longjmp(...) directly from the SIGTERM handler
It's way too easy to imagine leaving a mutex or a spin-lock held in the /vpe-api shared-memory segment, or elsewhere. Set a volatile variable and check it in a safe place... Change-Id: I9d91c38cffeb921143c272162d055c9c24a6c312 Signed-off-by: Dave Barach <dave@barachs.net> (cherry picked from commit 903651caf320dfdaabd20a0e6f3cd0ffc843e02f)
Diffstat (limited to 'src/vlib/unix/main.c')
-rw-r--r--src/vlib/unix/main.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/src/vlib/unix/main.c b/src/vlib/unix/main.c
index ed0631ec..f286c870 100644
--- a/src/vlib/unix/main.c
+++ b/src/vlib/unix/main.c
@@ -75,7 +75,7 @@ VLIB_INIT_FUNCTION (unix_main_init);
static void
unix_signal_handler (int signum, siginfo_t * si, ucontext_t * uc)
{
- uword fatal;
+ uword fatal = 0;
u8 *msg = 0;
msg = format (msg, "received signal %U, PC %U",
@@ -91,10 +91,9 @@ unix_signal_handler (int signum, siginfo_t * si, ucontext_t * uc)
if (unix_main.vlib_main->main_loop_exit_set)
{
syslog (LOG_ERR | LOG_DAEMON, "received SIGTERM, exiting...");
-
- clib_longjmp (&unix_main.vlib_main->main_loop_exit,
- VLIB_MAIN_LOOP_EXIT_CLI);
+ unix_main.vlib_main->main_loop_exit_now = 1;
}
+ break;
/* fall through */
case SIGQUIT:
case SIGINT: