main: 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 (killall -SIGABRT
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.

Fixes: OS#4865
Change-Id: I3caa78e6ce7c9a98b0a26fde61468bd7b38c6fd9
This commit is contained in:
Pau Espin 2020-11-25 17:48:25 +01:00
parent b73faa4749
commit be67ad0c3e
1 changed files with 10 additions and 2 deletions

View File

@ -198,8 +198,16 @@ static void signal_handler(int signal)
{
switch (signal) {
case SIGABRT:
/* in case of abort, we want to obtain a talloc report
* and then return to the caller, who will abort the process */
/* in case of abort, we want to obtain a talloc report and
* 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(g_tall_ctx, stderr);
signal(SIGABRT, SIG_DFL);
raise(SIGABRT);
break;
case SIGUSR1:
talloc_report_full(g_tall_ctx, stderr);
break;