|
|
|
@ -306,6 +306,9 @@ static void SignalHandlerUnexpected(int sig_num, siginfo_t *info, void *context)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
char msg[SC_LOG_MAX_LOG_MSG_LEN];
|
|
|
|
char msg[SC_LOG_MAX_LOG_MSG_LEN];
|
|
|
|
unw_cursor_t cursor;
|
|
|
|
unw_cursor_t cursor;
|
|
|
|
|
|
|
|
/* Restore defaults for signals to avoid loops */
|
|
|
|
|
|
|
|
signal(SIGABRT, SIG_DFL);
|
|
|
|
|
|
|
|
signal(SIGSEGV, SIG_DFL);
|
|
|
|
int r;
|
|
|
|
int r;
|
|
|
|
if ((r = unw_init_local(&cursor, (unw_context_t *)(context)) != 0)) {
|
|
|
|
if ((r = unw_init_local(&cursor, (unw_context_t *)(context)) != 0)) {
|
|
|
|
fprintf(stderr, "unable to obtain stack trace: unw_init_local: %s\n", unw_strerror(r));
|
|
|
|
fprintf(stderr, "unable to obtain stack trace: unw_init_local: %s\n", unw_strerror(r));
|
|
|
|
@ -338,9 +341,8 @@ static void SignalHandlerUnexpected(int sig_num, siginfo_t *info, void *context)
|
|
|
|
SCLogError(SC_ERR_SIGNAL, "%s", msg);
|
|
|
|
SCLogError(SC_ERR_SIGNAL, "%s", msg);
|
|
|
|
|
|
|
|
|
|
|
|
terminate:
|
|
|
|
terminate:
|
|
|
|
// Terminate with SIGABRT ... but first, restore that signal's default handling
|
|
|
|
// Propagate signal to watchers, if any
|
|
|
|
signal(SIGABRT, SIG_DFL);
|
|
|
|
kill(0, sig_num);
|
|
|
|
abort();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#undef UNW_LOCAL_ONLY
|
|
|
|
#undef UNW_LOCAL_ONLY
|
|
|
|
#endif /* HAVE_LIBUNWIND */
|
|
|
|
#endif /* HAVE_LIBUNWIND */
|
|
|
|
|