gtphub: generate coredump and exit upon SIGABRT received

Previous code relied on abort() switching sigaction to SIG_FDL +
retriggering SIGABRT in case the signal handler returns, which would
then generate the coredump + terminate the process.
However, if a SIGABRT is received from somewhere else (kill -SIGABRT),
then the process would print the talloc report and continue running,
which is not desired.

Change-Id: I1cab4a716cf2fda6353f698888edbcec6228d78b
Fixes: OS#4865
This commit is contained in:
Pau Espin 2020-11-25 18:03:21 +01:00
parent 826eaa327b
commit 7ffc6603e2
1 changed files with 13 additions and 5 deletions

View File

@ -95,11 +95,11 @@ void log_cfg(struct gtphub_cfg *cfg)
} }
} }
static void signal_handler(int signal) static void signal_handler(int signum)
{ {
fprintf(stdout, "signal %d received\n", signal); fprintf(stdout, "signal %d received\n", signum);
switch (signal) { switch (signum) {
case SIGINT: case SIGINT:
case SIGTERM: case SIGTERM:
osmo_signal_dispatch(SS_L_GLOBAL, S_L_GLOBAL_SHUTDOWN, NULL); osmo_signal_dispatch(SS_L_GLOBAL, S_L_GLOBAL_SHUTDOWN, NULL);
@ -107,8 +107,16 @@ static void signal_handler(int signal)
exit(0); exit(0);
break; break;
case SIGABRT: case SIGABRT:
/* in case of abort, we want to obtain a talloc report /* in case of abort, we want to obtain a talloc report and
* and then return to the caller, who will abort the process */ * then run default SIGABRT handler, who will generate coredump
* and abort the process. abort() should do this for us after we
* return, but program wouldn't exit if an external SIGABRT is
* received.
*/
talloc_report_full(osmo_gtphub_ctx, stderr);
signal(SIGABRT, SIG_DFL);
raise(SIGABRT);
break;
case SIGUSR1: case SIGUSR1:
case SIGUSR2: case SIGUSR2:
talloc_report_full(osmo_gtphub_ctx, stderr); talloc_report_full(osmo_gtphub_ctx, stderr);