}
original_sigactions[] =
{
+ { SIGILL, { } },
{ SIGABRT, { } },
{ SIGBUS, { } },
+ { SIGFPE, { } },
{ SIGSEGV, { } },
{ 0, { } },
};
}
original_sighandlers[] =
{
+ { SIGILL, SIG_DFL },
{ SIGABRT, SIG_DFL },
{ SIGBUS, SIG_DFL },
+ { SIGFPE, SIG_DFL },
{ SIGSEGV, SIG_DFL },
{ 0, SIG_DFL },
};
const char* sigstr = "???\n";
switch (signal)
{
+ case SIGILL:
+ sigstr = STRINGIFY(SIGILL) " (" STRINGIFY_MX(SIGILL) ")";
+ break;
case SIGABRT:
sigstr = STRINGIFY(SIGABRT) " (" STRINGIFY_MX(SIGABRT) ")";
break;
case SIGBUS:
sigstr = STRINGIFY(SIGBUS) " (" STRINGIFY_MX(SIGBUS) ")";
break;
+ case SIGFPE:
+ sigstr = STRINGIFY(SIGFPE) " (" STRINGIFY_MX(SIGFPE) ")";
+ break;
case SIGSEGV:
sigstr = STRINGIFY(SIGSEGV) " (" STRINGIFY_MX(SIGSEGV) ")";
break;
return true;
}
+void install_oops_handler()
+{
+ add_signal(SIGILL, oops_handler);
+ add_signal(SIGABRT, oops_handler);
+ add_signal(SIGBUS, oops_handler);
+ add_signal(SIGFPE, oops_handler);
+ add_signal(SIGSEGV, oops_handler);
+}
+
void init_signals()
{
sigset_t set;
// FIXIT-L this is undefined for multithreaded apps
sigprocmask(SIG_SETMASK, &set, nullptr);
- // Make this program behave nicely when signals come along.
+ // First things first, install the crash handler
+ install_oops_handler();
+
+ // Ignore SIGPIPE for now (it's not particularly actionable in a multithreaded program)
+ add_signal(SIGPIPE, SIG_IGN);
+
+ // Set up a clean exit when expected shutdown signals come along
add_signal(SIGTERM, exit_handler);
add_signal(SIGINT, exit_handler);
add_signal(SIGQUIT, dirty_handler);
+ // Finally, set up signal handlers for custom Snort actions
add_signal(SIGNAL_SNORT_DUMP_STATS, dump_stats_handler);
add_signal(SIGNAL_SNORT_ROTATE_STATS, rotate_stats_handler);
add_signal(SIGNAL_SNORT_RELOAD, reload_config_handler);
add_signal(SIGNAL_SNORT_READ_ATTR_TBL, reload_attrib_handler);
- add_signal(SIGPIPE, SIG_IGN);
- add_signal(SIGABRT, oops_handler);
- add_signal(SIGSEGV, oops_handler);
- add_signal(SIGBUS, oops_handler);
-
+ // Errno will have potentially been left set from a failed handler installation
errno = 0;
}
-void term_signals()
+void remove_oops_handler()
{
- restore_signal(SIGTERM);
- restore_signal(SIGINT);
- restore_signal(SIGQUIT);
+ restore_signal(SIGILL);
+ restore_signal(SIGABRT);
+ restore_signal(SIGBUS);
+ restore_signal(SIGFPE);
+ restore_signal(SIGSEGV);
+}
+void term_signals()
+{
restore_signal(SIGNAL_SNORT_DUMP_STATS);
restore_signal(SIGNAL_SNORT_ROTATE_STATS);
restore_signal(SIGNAL_SNORT_RELOAD);
restore_signal(SIGNAL_SNORT_READ_ATTR_TBL);
+ restore_signal(SIGTERM);
+ restore_signal(SIGINT);
+ restore_signal(SIGQUIT);
+
restore_signal(SIGPIPE);
- restore_signal(SIGABRT);
- restore_signal(SIGSEGV);
- restore_signal(SIGBUS);
+
+ remove_oops_handler();
}
static void help_signal(unsigned n, const char* name, const char* h)
return false;
}
-static PHInstance* get_instance_by_type(FrameworkPolicy* fp, const char* keyword)
-{
- std::vector<PHInstance*>::iterator it;
-
- for ( it = fp->ilist.begin(); it != fp->ilist.end(); ++it )
- {
- if ( !strcmp((*it)->pp_class.api.base.name, keyword) )
- return *it;
- }
- return nullptr;
-}
-
static PHInstance* get_instance_by_service(FrameworkPolicy* fp, const char* keyword)
{
std::vector<PHInstance*>::iterator it;
p->set_reloaded(RELOAD_TYPE_NONE);
}
-// FIXIT-M create a separate list for meta handlers? is there really more than one?
-void InspectorManager::dispatch_meta(FrameworkPolicy* fp, int type, const uint8_t* data)
-{
- for ( auto* p : fp->ilist )
- p->handler->meta(type, data);
-}
-
Binder* InspectorManager::get_binder()
{
InspectionPolicy* pi = get_inspection_policy();
return (Binder*)pi->framework_policy->binder;
}
-bool InspectorManager::inspector_exists_in_any_policy(const char* key, SnortConfig* sc)
-{
- PolicyMap* pm = sc->policy_map;
-
- if (pm == nullptr)
- return false;
-
- for (unsigned i=0; i<pm->inspection_policy_count(); i++)
- {
- const InspectionPolicy* const pi = pm->get_inspection_policy(i);
-
- if ( !pi || !pi->framework_policy )
- continue;
-
- const PHInstance* const p = get_instance_by_type(pi->framework_policy, key);
-
- if ( p )
- return true;
- }
-
- return false;
-}
-
// FIXIT-P cache get_inspector() returns or provide indexed lookup
Inspector* InspectorManager::get_inspector(const char* key, bool dflt_only, const SnortConfig* sc)
{