@ -298,6 +298,53 @@ static void SignalHandlerSigterm(/*@unused@*/ int sig)
{
{
sigterm_count = 1 ;
sigterm_count = 1 ;
}
}
# ifndef OS_WIN32
# if HAVE_LIBUNWIND
# define UNW_LOCAL_ONLY
# include <libunwind.h>
static void SignalHandlerUnexpected ( int sig_num , siginfo_t * info , void * context )
{
char msg [ SC_LOG_MAX_LOG_MSG_LEN ] ;
unw_cursor_t cursor ;
int r ;
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 ) ) ;
goto terminate ;
}
char * temp = msg ;
int cw = snprintf ( temp , SC_LOG_MAX_LOG_MSG_LEN - ( temp - msg ) , " stacktrace:sig %d: " , sig_num ) ;
temp + = cw ;
r = 1 ;
while ( r > 0 ) {
if ( unw_is_signal_frame ( & cursor ) = = 0 ) {
unw_word_t off ;
char name [ 256 ] ;
if ( unw_get_proc_name ( & cursor , name , sizeof ( name ) , & off ) = = UNW_ENOMEM ) {
cw = snprintf ( temp , SC_LOG_MAX_LOG_MSG_LEN - ( temp - msg ) , " [unknown]: " ) ;
} else {
cw = snprintf (
temp , SC_LOG_MAX_LOG_MSG_LEN - ( temp - msg ) , " %s+0x%08 " PRIx64 , name , off ) ;
}
temp + = cw ;
}
r = unw_step ( & cursor ) ;
if ( r > 0 ) {
cw = snprintf ( temp , SC_LOG_MAX_LOG_MSG_LEN - ( temp - msg ) , " ; " ) ;
temp + = cw ;
}
}
SCLogError ( SC_ERR_SIGNAL , " %s " , msg ) ;
terminate :
// Terminate with SIGABRT ... but first, restore that signal's default handling
signal ( SIGABRT , SIG_DFL ) ;
abort ( ) ;
}
# undef UNW_LOCAL_ONLY
# endif /* HAVE_LIBUNWIND */
# endif /* !OS_WIN32 */
# endif
# endif
# ifndef OS_WIN32
# ifndef OS_WIN32
@ -2005,6 +2052,22 @@ static int InitSignalHandler(SCInstance *suri)
# ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
# ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
UtilSignalHandlerSetup ( SIGINT , SignalHandlerSigint ) ;
UtilSignalHandlerSetup ( SIGINT , SignalHandlerSigint ) ;
UtilSignalHandlerSetup ( SIGTERM , SignalHandlerSigterm ) ;
UtilSignalHandlerSetup ( SIGTERM , SignalHandlerSigterm ) ;
# if HAVE_LIBUNWIND
int enabled ;
if ( ConfGetBool ( " logging.stacktrace-on-signal " , & enabled ) = = 0 ) {
enabled = 1 ;
}
if ( enabled ) {
SCLogInfo ( " Preparing unexpected signal handling " ) ;
struct sigaction stacktrace_action ;
memset ( & stacktrace_action , 0 , sizeof ( stacktrace_action ) ) ;
stacktrace_action . sa_sigaction = SignalHandlerUnexpected ;
stacktrace_action . sa_flags = SA_SIGINFO ;
sigaction ( SIGSEGV , & stacktrace_action , NULL ) ;
sigaction ( SIGABRT , & stacktrace_action , NULL ) ;
}
# endif /* HAVE_LIBUNWIND */
# endif
# endif
# ifndef OS_WIN32
# ifndef OS_WIN32
UtilSignalHandlerSetup ( SIGHUP , SignalHandlerSigHup ) ;
UtilSignalHandlerSetup ( SIGHUP , SignalHandlerSigHup ) ;