mirror of
https://github.com/adtools/clib2.git
synced 2025-12-08 14:59:05 +00:00
The SIGABRT handler can no longer invoke abort() recursively.
This commit is contained in:
@@ -88,14 +88,15 @@ raise(int sig)
|
||||
/* Which handler is installed for this signal? */
|
||||
handler = __signal_handler_table[sig - SIGABRT];
|
||||
|
||||
/* Should we ignore this signal? */
|
||||
/* Should we handle this signal rather than ignoring it? */
|
||||
if (handler != SIG_IGN)
|
||||
{
|
||||
/* Block delivery of this signal to prevent recursion. */
|
||||
SET_FLAG(local_signals_blocked, (1 << sig));
|
||||
|
||||
/* The default behaviour is to drop into abort(), or do
|
||||
something very much like it. */
|
||||
* something very much like it.
|
||||
*/
|
||||
if (handler == SIG_DFL)
|
||||
{
|
||||
SHOWMSG("this is the default handler");
|
||||
@@ -114,14 +115,14 @@ raise(int sig)
|
||||
SHOWMSG("bye, bye...");
|
||||
}
|
||||
|
||||
/* Drop straight into abort(), which might call signal()
|
||||
again but is otherwise guaranteed to eventually
|
||||
land us in _exit(). */
|
||||
abort();
|
||||
/* Drop straight into __abort(), which will
|
||||
eventually land us in _exit(). Note that
|
||||
abort() calls raise(SIGABRT). */
|
||||
__abort();
|
||||
}
|
||||
else
|
||||
{
|
||||
SHOWMSG("calling the handler");
|
||||
SHOWMSG("calling the signal handler");
|
||||
|
||||
(*handler)(sig);
|
||||
|
||||
|
||||
@@ -46,15 +46,8 @@
|
||||
/****************************************************************************/
|
||||
|
||||
void
|
||||
abort(void)
|
||||
__abort(void)
|
||||
{
|
||||
/* Try to call the signal handler that might be in charge of
|
||||
handling cleanup operations, etc. */
|
||||
raise(SIGABRT);
|
||||
|
||||
/* If the signal handler returns it means that we still have
|
||||
to terminate the program. */
|
||||
|
||||
__check_abort_enabled = FALSE;
|
||||
|
||||
__print_termination_message(NULL);
|
||||
@@ -63,3 +56,17 @@ abort(void)
|
||||
does not trigger the exit trap. */
|
||||
_exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void
|
||||
abort(void)
|
||||
{
|
||||
/* Try to call the signal handler that might be in charge of
|
||||
handling cleanup operations, etc. */
|
||||
raise(SIGABRT);
|
||||
|
||||
/* If the signal handler returns it means that we still have
|
||||
to terminate the program. */
|
||||
__abort();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user