From: Bhagya Tholpady (bbantwal) Date: Tue, 20 Oct 2020 17:52:37 +0000 (+0000) Subject: Merge pull request #2521 in SNORT/snort3 from ~SELYSENK/snort3:trace_segfault to... X-Git-Tag: 3.0.3-3~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=080aaf43570a053f931ac232b66af49061eecd58;p=thirdparty%2Fsnort3.git Merge pull request #2521 in SNORT/snort3 from ~SELYSENK/snort3:trace_segfault to master Squashed commit of the following: commit dcb8788f355a62d51885ee1d399a7cab90f4ed45 Author: Serhii Lysenko Date: Mon Oct 5 17:26:20 2020 +0300 trace: skip trace reload if no initial config present --- diff --git a/src/main.cc b/src/main.cc index a4bd42328..ae7f2ea79 100644 --- a/src/main.cc +++ b/src/main.cc @@ -52,6 +52,8 @@ #include "target_based/host_attributes.h" #include "time/periodic.h" #include "trace/trace_api.h" +#include "trace/trace_config.h" +#include "trace/trace_logger.h" #include "utils/util.h" #include "utils/safec.h" @@ -382,6 +384,13 @@ int main_reload_config(lua_State* L) else LogMessage("No host attribute table loaded\n"); + if ( !old or !old->trace_config or !old->trace_config->initialized ) + { + LogMessage("== WARNING: Trace module was not configured during " + "initial startup. Ignoring the new trace configuration.\n"); + sc->trace_config->clear(); + } + PluginManager::reload_so_plugins_cleanup(sc); SnortConfig::set_conf(sc); TraceApi::thread_reinit(sc->trace_config); diff --git a/src/main/snort.cc b/src/main/snort.cc index 4c41f4169..9d435a527 100644 --- a/src/main/snort.cc +++ b/src/main/snort.cc @@ -68,6 +68,8 @@ #include "target_based/host_attributes.h" #include "time/periodic.h" #include "trace/trace_api.h" +#include "trace/trace_config.h" +#include "trace/trace_logger.h" #include "utils/util.h" #ifdef PIGLET @@ -535,9 +537,19 @@ SnortConfig* Snort::get_updated_policy( if ( fname ) { + bool uninitialized_trace = !other_conf->trace_config or + !other_conf->trace_config->initialized; + Shell sh = Shell(fname); sh.configure(sc, false, true); + if ( uninitialized_trace ) + { + LogMessage("== WARNING: Trace module was not configured during " + "initial startup. Ignoring the new trace configuration.\n"); + sc->trace_config->clear(); + } + if ( ModuleManager::get_errors() || !sc->verify() ) { sc->cloned = true; diff --git a/src/trace/trace_config.cc b/src/trace/trace_config.cc index a427f68a2..04078f2fe 100644 --- a/src/trace/trace_config.cc +++ b/src/trace/trace_config.cc @@ -72,6 +72,14 @@ bool TraceConfig::set_trace(const std::string& module_name, const std::string& t return false; } +void TraceConfig::clear() +{ + clear_traces(); + initialized = false; + delete logger_factory; + logger_factory = nullptr; +} + void TraceConfig::clear_traces() { for ( auto& trace : traces ) diff --git a/src/trace/trace_config.h b/src/trace/trace_config.h index 320a06e01..c20cf61d3 100644 --- a/src/trace/trace_config.h +++ b/src/trace/trace_config.h @@ -39,13 +39,14 @@ public: bool set_trace(const std::string& module_name, const std::string& trace_option_name, uint8_t trace_level); + void clear(); void clear_traces(); public: snort::TraceLoggerFactory* logger_factory = nullptr; snort::PacketConstraints* constraints = nullptr; bool log_ntuple = false; - + bool initialized = false; private: Traces traces; }; diff --git a/src/trace/trace_module.cc b/src/trace/trace_module.cc index b81277a1b..b0c4b5a00 100644 --- a/src/trace/trace_module.cc +++ b/src/trace/trace_module.cc @@ -239,6 +239,8 @@ bool TraceModule::end(const char* fqn, int, SnortConfig* sc) trace_parser->finalize_constraints(); } + trace_parser->get_trace_config().initialized = true; + delete trace_parser; trace_parser = nullptr; } diff --git a/src/trace/trace_swap.cc b/src/trace/trace_swap.cc index 094c2548c..d9a9715b6 100644 --- a/src/trace/trace_swap.cc +++ b/src/trace/trace_swap.cc @@ -145,9 +145,17 @@ void TraceSwap::print_msg() const static int set(lua_State* L) { + const SnortConfig* sc = SnortConfig::get_conf(); + + if ( !sc->trace_config->initialized ) + { + LogMessage("== WARNING: Trace module was not configured during " + "initial startup. Ignoring the new trace configuration.\n"); + return 0; + } + // Create an overlay TraceConfig based on the current configuration // It will be set in a SnortConfig during TraceSwap execution and owned by it after - const SnortConfig* sc = SnortConfig::get_conf(); TraceConfig* trace_config = new TraceConfig(sc->overlay_trace_config ? *sc->overlay_trace_config : *sc->trace_config);