]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
cleaned up inspector api and class methods
authorRuss Combs <rucombs@cisco.com>
Fri, 25 Apr 2014 22:04:21 +0000 (18:04 -0400)
committerRuss Combs <rucombs@cisco.com>
Fri, 25 Apr 2014 22:04:21 +0000 (18:04 -0400)
19 files changed:
ChangeLog [new file with mode: 0644]
src/analyzer.cc
src/flow/flow.cc
src/framework/inspector.h
src/managers/inspector_manager.cc
src/managers/inspector_manager.h
src/network_inspectors/arp_spoof/arp_spoof.cc
src/network_inspectors/defrag/defrag.cc
src/network_inspectors/normalize/normalize.cc
src/network_inspectors/perf_monitor/perf_monitor.cc
src/network_inspectors/port_scan/port_scan.cc
src/network_inspectors/port_scan/ps_inspect.h
src/network_inspectors/stream5/stream.cc
src/service_inspectors/back_orifice/back_orifice.cc
src/service_inspectors/ftp_telnet/ftp.cc
src/service_inspectors/ftp_telnet/telnet.cc
src/service_inspectors/http_inspect/http_inspect.cc
src/service_inspectors/rpc_decode/rpc_decode.cc
src/snort.cc

diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..84dd884
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,15 @@
+75
+-- added back InspectApi.pinit() and InspectApi.pterm()
+-- eliminated InspectApi.stop()
+-- changed signature to Inspector::configure()
+-- Inspector::init() and term() are now pinit() and pterm()!  beware!
+   (for consistency with naming scheme)
+-- other changes to InspectApi / Inspector per comments in header
+
+74
+-- started this ChangeLog for internal use only
+-- fixed -A none and -K none
+-- more refactoring of ftp/telnet and modularization
+-- changed lua/*.lua to EXTRA_DIST to avoid installation overwrites
+-- updated snort.lua wrt the legacy include - read comments therein
+
index 72c6c0cfce9af04231311750222cb1788513e64d..14647894fe589613180d64ce1c5fa988d25401c7 100644 (file)
@@ -344,9 +344,6 @@ static void snort_thread_init(const char* intf)
 
     PacketManager::set_grinder();
 
-    // perfmon, for one, opens a log file for writing here
-    InspectorManager::post_config(snort_conf);
-
     FileAPIPostInit();
     Encode_Init();
 
index 2b1d53ebe005cab2aba3b9179bf21916c59a3ac8..acebcc3c48a77d80779eeb03ae03d3520f8de27c 100644 (file)
@@ -119,6 +119,7 @@ void Flow::clear(bool freeAppData)
 int Flow::set_application_data(FlowData* fd)
 {
     FlowData *appData = get_application_data(fd->get_id());
+    assert(appData != fd);
 
     if (appData)
         free_application_data(appData);
index ce78dc209e58eeae04e0886e743d28d2edc31ee9..75fe6e73caf73dc37f48e6f84bf302625878fff8 100644 (file)
@@ -42,21 +42,22 @@ struct SnortConfig;
 class Inspector
 {
 public:
+    // main thread functions
     virtual ~Inspector();
 
-    virtual void configure(SnortConfig*) { };
-    virtual int verify(SnortConfig*) { return 0; };
-
-    virtual void setup(SnortConfig*) { };  // unprivileged init, stream_api etc.
+    // access external dependencies here
+    // return verification status
+    virtual bool configure(SnortConfig*) { return true; };
     virtual void show(SnortConfig*) { };
 
+    // packet thread functions
+    virtual void pinit() { };
+    virtual void pterm() { };
+
     virtual void eval(Packet*) = 0;
     virtual void meta(int, const uint8_t*) { };
 
-    virtual void init() { };   // allocate thread local runtime data based on config
-    virtual void term() { };   // release thread local runtime data
-    virtual void reset() { };  // 
-
+    // framework support
     unsigned get_ref(unsigned i) { return ref_count[i]; };
     void set_ref(unsigned i, unsigned r) { ref_count[i] = r; };
 
@@ -69,7 +70,8 @@ public:
     static THREAD_LOCAL unsigned slot;
 
 protected:
-    Inspector();
+    // main thread functions
+    Inspector();  // internal init only at this point
 
 private:
     unsigned* ref_count;
@@ -86,16 +88,11 @@ enum Priority {
     PRIORITY_MAX
 };
 
-typedef void (*PreprocFunc)();
-typedef void* (*PreprocInitFunc)(void*);
-
-// FIXIT these should take no arg now
-typedef void (*PreprocClassFunc)(void*);
-
-typedef Inspector* (*PreprocCtorFunc)(Module*);
+typedef Inspector* (*PreprocCtor)(Module*);
 typedef void (*PreprocDtorFunc)(Inspector*);
+typedef void (*PreprocFunc)();
 
-// FIXIT ensure all pp's provide stats
+// FIXIT ensure all provide stats
 struct InspectApi
 {
     BaseApi base;
@@ -103,18 +100,18 @@ struct InspectApi
     uint16_t proto_bits;
 
     // main thread funcs - parse time data only
-    PreprocFunc init;        // allocate process static data
-    PreprocFunc term;        // release init() data
-
-    PreprocCtorFunc ctor;
-    PreprocDtorFunc dtor;
+    PreprocFunc init;      // allocate process static data
+    PreprocFunc term;      // release init() data
+    PreprocCtor ctor;      // instantiate inspector from Module data
+    PreprocDtorFunc dtor;  // release inspector instance
 
     // packet thread funcs - runtime data only
-    PreprocClassFunc stop;   // stop packet processing  // FIXIT same as purge?
-    PreprocClassFunc purge;  // purge caches
-    PreprocClassFunc sum;    // accumulate stats
-    PreprocClassFunc stats;  // output stats
-    PreprocClassFunc reset;  // clear stats
+    PreprocFunc pinit;  // plugin thread local allocation
+    PreprocFunc pterm;  // plugin thread local cleanup
+    PreprocFunc purge;  // purge caches
+    PreprocFunc sum;    // accumulate stats
+    PreprocFunc stats;  // output stats
+    PreprocFunc reset;  // clear stats
 };
 
 #endif
index e1e6b1a1a244fe7d617fd37ea634c3e4ed246191..8542f8cdd7952123e31c53ab8ee219b935b22579 100644 (file)
@@ -65,16 +65,10 @@ struct PHGlobal {
 
 struct PHClass {
     const InspectApi& api;
-    void* data;
 
-    PHClass(const InspectApi& p) : api(p)
-    {
-        // FIXIT this should be Module* and data
-        data = nullptr;
-    };
-    ~PHClass()
-    {
-    }
+    PHClass(const InspectApi& p) : api(p) { };
+    ~PHClass() { };
+
     static bool comp (PHClass* a, PHClass* b)
     { return ( a->api.priority < b->api.priority ); };
 };
@@ -300,7 +294,7 @@ void InspectorManager::dump_stats (SnortConfig* sc)
 {
     for ( auto* p : sc->framework_config->ph_list )
         if ( p->api.stats )
-            p->api.stats(p->data);
+            p->api.stats();
 }
 
 void InspectorManager::accumulate (SnortConfig* sc)
@@ -310,7 +304,7 @@ void InspectorManager::accumulate (SnortConfig* sc)
 
     for ( auto* p : sc->framework_config->ph_list )
         if ( p->api.sum )
-            p->api.sum(p->data);
+            p->api.sum();
 
     pc_sum();
     stats_mutex.unlock();
@@ -320,96 +314,56 @@ void InspectorManager::reset_stats (SnortConfig* sc)
 {
     for ( auto* p : sc->framework_config->ph_list )
         if ( p->api.reset )
-            p->api.reset(p->data);
-}
-
-int InspectorManager::check_config(SnortConfig* sc)
-{
-    InspectionPolicy* pi = get_inspection_policy();
-
-    for ( auto* p : pi->framework_policy->ph_list )
-    {
-        if ( int rval = p->handler->verify(sc) )
-            return rval;
-    }
-    return 0;
+            p->api.reset();
 }
 
 // this is per thread
-void InspectorManager::post_config(SnortConfig* sc)
-{
-    InspectionPolicy* pi = get_inspection_policy();
-
-    if ( !pi->framework_policy )
-        return;
-
-    for ( auto* p : pi->framework_policy->ph_list )
-    {
-        p->handler->setup(sc);
-    }
-}
-
-void InspectorManager::thread_init(SnortConfig*, unsigned slot)
+void InspectorManager::thread_init(SnortConfig* sc, unsigned slot)
 {
     EventManager::open_outputs();
     IpsManager::setup_options();
 
     Inspector::slot = slot;
+
+    for ( auto* p : sc->framework_config->ph_list )
+        if ( p->api.pinit )
+            p->api.pinit();
+
     InspectionPolicy* pi = get_inspection_policy();
 
     if ( !pi->framework_policy )
         return;
 
     for ( auto* p : pi->framework_policy->ph_list )
-        p->handler->init();
+        p->handler->pinit();
 }
 
 void InspectorManager::thread_term(SnortConfig* sc)
 {
-    shutdown(sc);
-
     InspectionPolicy* pi = get_inspection_policy();
 
     if ( !pi || !pi->framework_policy )
         return;
 
     for ( auto* p : pi->framework_policy->ph_list )
-        p->handler->term();
+        p->handler->pterm();
+
+    for ( auto* p : sc->framework_config->ph_list )
+        if ( p->api.pterm )
+            p->api.pterm();
 
     accumulate(sc);
     IpsManager::clear_options();
     EventManager::close_outputs();
 }
 
-// FIXIT this does 2 things due to the convolution of class and global data
-// first it purges all preprocs - this operates on global data like session caches
-// then it resets all instances
+// purges all inspector plugins - eg global session caches
 void InspectorManager::reset (SnortConfig* sc)
 {
     for ( auto* p : sc->framework_config->ph_list )
     {
         if ( p->api.purge )
-            p->api.purge(p->data);
-    }
-    InspectionPolicy* pi = get_inspection_policy();
-
-    if ( !pi->framework_policy )
-        return;
-
-    for ( auto* p : pi->framework_policy->ph_list )
-        p->handler->reset();
-}
-
-// this is the last chance to process data - interact with other modules
-// after this preprocs are being freed and can't be used to process data
-void InspectorManager::shutdown (SnortConfig* sc)
-{
-    Active_Suspend();
-
-    for ( auto* p : sc->framework_config->ph_list )
-    {
-        if ( p->api.stop )
-            p->api.stop(p->data);
+            p->api.purge();
     }
 }
 
@@ -444,7 +398,7 @@ void InspectorManager::instantiate(
     }
 }
 
-void InspectorManager::configure(SnortConfig *sc)
+bool InspectorManager::configure(SnortConfig *sc)
 {
     Inspector::max_slots = sc->max_threads;
     s_handlers.sort(PHGlobal::comp);
@@ -452,12 +406,15 @@ void InspectorManager::configure(SnortConfig *sc)
     // FIXIT use FrameworkConfig or FrameworkPolicy ?
     //FrameworkConfig* fc = sc->framework_config;
     FrameworkPolicy* fp = sc->policy_map->inspection_policy[0]->framework_policy;
+    bool ok = true;
 
     for ( auto* p : fp->ph_list )
-        p->handler->configure(sc);
+        ok = p->handler->configure(sc) && ok;
 
     fp->ph_list.sort(PHInstance::comp);
     fp->Vectorize();
+
+    return ok;
 }
 
 void InspectorManager::print_config(SnortConfig *sc)
index 1a8d01407157c418262e6be4888c97268c9d28a6..791d4105d6e697ea6e001acc8aa4ce3f65a4789b 100644 (file)
@@ -49,15 +49,12 @@ public:
     static void accumulate(SnortConfig*);
     static void reset_stats(SnortConfig*);
     static void reset(SnortConfig*);
-    static void shutdown(SnortConfig*);
 
     static void instantiate(const InspectApi*, Module*, SnortConfig*);
 
-    static void configure(SnortConfig*);
-    static int check_config(SnortConfig*);
+    static bool configure(SnortConfig*);
     static void print_config(SnortConfig*);
 
-    static void post_config(SnortConfig*);
     static void thread_init(SnortConfig*, unsigned);
     static void thread_term(SnortConfig*);
 
index a657d4f0d89ffc9483122a182bee6b8fbb2ea1d4..27c66f0199b79e53a1fdecbf8a97ae525d5416f7 100644 (file)
@@ -310,13 +310,13 @@ static Inspector* as_ctor(Module* m)
 static void as_dtor(Inspector* p)
 { delete p; }
 
-static void as_sum(void*)
+static void as_sum()
 { sum_stats(&gasstats, &asstats); }
 
-static void as_stats(void*)
+static void as_stats()
 { show_stats(&gasstats, MOD_NAME); }
 
-static void as_reset(void*)
+static void as_reset()
 { memset(&gasstats, 0, sizeof(gasstats)); }
 
 static const InspectApi as_api =
@@ -335,7 +335,8 @@ static const InspectApi as_api =
     nullptr, // term
     as_ctor,
     as_dtor,
-    nullptr, // stop
+    nullptr, // pinit
+    nullptr, // pterm
     nullptr, // purge
     as_sum,
     as_stats,
index 74b79dab3da13b3ecda66660f728f7fb4e8f55e6..9d880fcc99f7d67284529d93e7b179a33e71c1e9 100644 (file)
@@ -2103,14 +2103,13 @@ public:
     Defrag(DefragEngineModule*);
     ~Defrag();
 
-    void configure(SnortConfig*);
-    int verify(SnortConfig*);
+    bool configure(SnortConfig*);
     void show(SnortConfig*);
 
     void eval(Packet*);
 
-    void init();
-    void term();
+    void pinit();
+    void pterm();
 
 private:
     int insert(Packet*, FragTracker*, FRAGKEY*, FragEngine*);
@@ -2147,13 +2146,15 @@ Defrag::~Defrag()
         Share::release(global);
 }
 
-void Defrag::configure(SnortConfig*)
+bool Defrag::configure(SnortConfig*)
 {
     global = (FragData*)Share::acquire(GLOBAL_KEYWORD);
     config.common = global->data;
+    SFAT_SetPolicyIds(FragPolicyIdFromHostAttributeEntry);
+    return true;
 }
 
-void Defrag::init()
+void Defrag::pinit()
 {
     FragInitCache(&config);
 
@@ -2162,7 +2163,7 @@ void Defrag::init()
     pkt_snaplen = DAQ_GetSnapLen();
 }
 
-void Defrag::term()
+void Defrag::pterm()
 {
     sfxhash_delete(f_cache);
     f_cache = NULL;
@@ -2181,12 +2182,6 @@ void Defrag::term()
     encap_defrag_pkt = NULL;
 }
 
-int Defrag::verify(SnortConfig*)
-{
-    SFAT_SetPolicyIds(FragPolicyIdFromHostAttributeEntry);
-    return 0;
-}
-
 void Defrag::show(SnortConfig*)
 {
     FragPrintGlobalConfig(&config);  // FIXIT only show once; need separate inspector method?
@@ -3960,17 +3955,17 @@ static void de_init()
 #endif
 }
 
-static void de_sum(void*)
+static void de_sum()
 {
     sum_stats((PegCount*)&g_stats, (PegCount*)&t_stats, array_size(peg_names));
 }
 
-static void de_stats(void*)
+static void de_stats()
 {
     show_stats((PegCount*)&g_stats, peg_names, array_size(peg_names), ENGINE_KEYWORD);
 }
 
-static void de_reset(void*)
+static void de_reset()
 {
     if (f_cache != NULL)
         sfxhash_make_empty(f_cache);
@@ -4004,7 +3999,8 @@ static const InspectApi de_api =
     nullptr, // term
     de_ctor,
     de_dtor,
-    nullptr, // stop
+    nullptr, // pinit
+    nullptr, // pterm
     nullptr, // purge
     de_sum,
     de_stats,
index 40a5209de0202972b11c8a29af864cf7d0e68de9..b66ced4bfe953ca256f0705c68a8f4d64a8bbacb 100644 (file)
@@ -176,11 +176,9 @@ class Normalizer : public Inspector
 public:
     Normalizer(NormalizeModule*);
 
-    void configure(SnortConfig*);
-    void setup(SnortConfig*);
+    bool configure(SnortConfig*);
     void show(SnortConfig*);
     void eval(Packet*);
-    bool enabled();
 
 private:
     NormalizerConfig config;
@@ -193,12 +191,7 @@ Normalizer::Normalizer(NormalizeModule* mod)
     disabled = false;
 }
 
-bool Normalizer::enabled ()
-{
-    return !disabled;
-}
-
-void Normalizer::configure(SnortConfig*)
+bool Normalizer::configure(SnortConfig*)
 {
     // FIXIT detection policy can't be used by normalizer
     // (not set until after normalizer runs)
@@ -206,23 +199,21 @@ void Normalizer::configure(SnortConfig*)
     {
         LogMessage("WARNING: normalizations disabled because not inline.\n");
         disabled = true;
-        return;
+        return true;
     }
 
-    InspectionPolicy* policy = get_inspection_policy();
-    policy->normal_mask = config.normalizer_flags;
-}
+    InspectionPolicy* ips = get_inspection_policy();
+    ips->normal_mask = config.normalizer_flags;
 
-void Normalizer::setup(SnortConfig*)
-{
-    NetworkPolicy* policy = get_network_policy();
+    NetworkPolicy* nap = get_network_policy();
 
-    if ( policy->new_ttl && policy->new_ttl < policy->min_ttl )
+    if ( nap->new_ttl && nap->new_ttl < nap->min_ttl )
     {
-        policy->new_ttl = policy->min_ttl;
+        nap->new_ttl = nap->min_ttl;
     }
 
     Norm_SetConfig(&config);
+    return true;
 }
 
 void Normalizer::show(SnortConfig* sc)
@@ -273,19 +264,19 @@ static void no_init()
 #endif
 }
 
-static void no_sum(void*)
+static void no_sum()
 {
     Norm_SumStats();
     Stream_SumNormalizationStats();
 }
 
-static void no_stats(void*)
+static void no_stats()
 {
     Norm_PrintStats(name);
     Stream_PrintNormalizationStats();
 }
 
-static void no_reset(void*)
+static void no_reset()
 {
     Norm_ResetStats();
     Stream_ResetNormalizationStats();
@@ -317,7 +308,8 @@ static const InspectApi no_api =
     nullptr, // term
     no_ctor,
     no_dtor,
-    nullptr, // stop
+    nullptr, // pinit
+    nullptr, // pterm
     nullptr, // purge
     no_sum,
     no_stats,
index 9958b748321ac0ad195bf61fa054c221e3b4f3e0..ecf4ed554c01eec58f3adc78585ae97c32d9e3cb 100644 (file)
@@ -214,13 +214,13 @@ public:
     PerfMonitor(PerfMonModule*);
     ~PerfMonitor();
 
-    void setup(SnortConfig*);
+    bool configure(SnortConfig*);
     void show(SnortConfig*);
 
     void eval(Packet*);
 
-    void init();
-    void term();
+    void pinit();
+    void pterm();
     void reset();
 
 private:
@@ -252,7 +252,7 @@ void PerfMonitor::show(SnortConfig*)
 // FIXIT perfmonitor should be logging to one file and writing record type and
 // version fields immediately after timestamp like
 // seconds, usec, type, version#, data1, data2, ...
-void PerfMonitor::setup(SnortConfig*)
+bool PerfMonitor::configure(SnortConfig*)
 {
     PerfMonitorChangeLogFilesPermission();
     std::string name;
@@ -280,9 +280,10 @@ void PerfMonitor::setup(SnortConfig*)
         if ( (config.flowip_fh = sfOpenFlowIPStatsFile(file)) == NULL )
             ParseError("Perfmonitor: Cannot open flow-ip stats file '%s'.", file);
     }
+    return true;
 }
 
-void PerfMonitor::init()
+void PerfMonitor::pinit()
 {
     InitPerfStats(&config);
 }
@@ -325,7 +326,7 @@ void PerfMonitor::eval(Packet *p)
     PREPROC_PROFILE_END(perfmonStats);
 }
 
-void PerfMonitor::term()
+void PerfMonitor::pterm()
 {
     if ( config.perf_flags & SFPERF_SUMMARY )
         sfPerfStatsSummary(&config);
@@ -373,17 +374,17 @@ static Inspector* pm_ctor(Module* m)
     return new PerfMonitor((PerfMonModule*)m);
 }
 
-static void pm_sum(void*)
+static void pm_sum()
 {
     sum_stats(&gpmstats, &pmstats);
 }
 
-static void pm_stats(void*)
+static void pm_stats()
 {
     show_stats(&gpmstats, mod_name);
 }
 
-static void pm_reset(void*)
+static void pm_reset()
 {
     memset(&gpmstats, 0, sizeof(gpmstats));
 }
@@ -409,7 +410,8 @@ static const InspectApi pm_api =
     nullptr, // term
     pm_ctor,
     pm_dtor,
-    nullptr, // stop
+    nullptr, // pinit
+    nullptr, // pterm
     nullptr, // purge
     pm_sum,
     pm_stats,
index 10433773999841cf59e2c82f618b17c688a502f3..07a52e611f6db953d2be6cf7a75aea7c416874fc 100644 (file)
@@ -872,7 +872,7 @@ PortScan::~PortScan()
         Share::release(global);
 }
 
-void PortScan::configure(SnortConfig* sc)
+bool PortScan::configure(SnortConfig* sc)
 {
     // FIXIT use fixed base file name
     config->logfile = SnortStrdup("portscan.log");
@@ -881,17 +881,15 @@ void PortScan::configure(SnortConfig* sc)
     config->common = global->data;
 
     ScSetScannedProtocols(sc, config->detect_scans);
+    return true;
 }
 
-// FIXIT why setup() vs init()?
-void PortScan::setup(SnortConfig*)
+void PortScan::pinit()
 {
-    if ( !config->logfile )
-        return;
+    g_tmp_pkt = Encode_New();
 
     std::string name;
     get_instance_file(name, config->logfile);
-    
     g_logfile = fopen(name.c_str(), "a+");
 
     if (g_logfile == NULL)
@@ -899,16 +897,10 @@ void PortScan::setup(SnortConfig*)
         FatalError("Portscan log file '%s' could not be opened: %s.\n",
             config->logfile, get_error(errno));
     }
-}
-
-void PortScan::init()
-{
-    g_tmp_pkt = Encode_New();
-
     ps_init_hash(config->common->memcap);
 }
 
-void PortScan::term()
+void PortScan::pterm()
 {
     fclose(g_logfile);
     ps_cleanup();
@@ -1013,17 +1005,17 @@ static void sp_dtor(Inspector* p)
     delete p;
 }
 
-static void sp_sum(void*)
+static void sp_sum()
 {
     sum_stats(&gspstats, &spstats);
 }
 
-static void sp_stats(void*)
+static void sp_stats()
 {
     show_stats(&gspstats, PS_MODULE);
 }
 
-static void sp_reset(void*)
+static void sp_reset()
 {
     ps_reset();
     memset(&gspstats, 0, sizeof(gspstats));
@@ -1045,7 +1037,8 @@ static const InspectApi sp_api =
     nullptr, // term
     sp_ctor,
     sp_dtor,
-    nullptr, // stop
+    nullptr, // pinit
+    nullptr, // pterm
     nullptr, // purge
     sp_sum,
     sp_stats,
index 4e99702d1e69dbbc2446729fa82a60e62bbc7341..ac004874aaf5959dc109e79a333378cff4f0de19 100644 (file)
@@ -41,12 +41,13 @@ public:
     PortScan(class PortScanModule*);
     ~PortScan();
 
-    void configure(SnortConfig*);
-    void setup(SnortConfig*);
+    bool configure(SnortConfig*);
     void show(SnortConfig*);
+
     void eval(Packet*);
-    void init();
-    void term();
+
+    void pinit();
+    void pterm();
 
 private:
     void ps_parse(SnortConfig*, char *);
index d834a9b6babcbbc469961a8f71c20cfad2772c18..8f30f124152111a334ff77deba2ea6e520253b49 100644 (file)
@@ -165,17 +165,15 @@ public:
     Stream5(Stream5GlobalConfig*);
     ~Stream5();
 
-    void configure(SnortConfig*);
+    bool configure(SnortConfig*);
     int verify_config(SnortConfig*);
-    int verify(SnortConfig*);
-    void setup(SnortConfig*);
     void show(SnortConfig*);
 
     void eval(Packet*);
 
-    void init();
-    void term();
-    void reset();
+    void pinit();
+    void pterm();
+    void reset();  // FIXIT delete if not used
 
 private:
     Stream5Config config;
@@ -215,7 +213,7 @@ Stream5::~Stream5()
         Share::release(ip_data);
 }
 
-void Stream5::configure(SnortConfig*)
+bool Stream5::configure(SnortConfig* sc)
 {
     if ( config.global_config->max_tcp_sessions )
     {
@@ -237,6 +235,13 @@ void Stream5::configure(SnortConfig*)
         ip_data = (StreamIpData*)Share::acquire("stream_ip");
         config.ip_config = ip_data->data;
     }
+
+#ifdef ENABLE_HA
+    if ( config.ha_config )
+        ha_setup(config.ha_config);
+#endif
+
+    return !verify_config(sc);
 }
 
 int Stream5::verify_config(SnortConfig* sc)
@@ -298,58 +303,7 @@ int Stream5::verify_config(SnortConfig* sc)
     return status;
 }
 
-int Stream5::verify(SnortConfig* sc)
-{
-    int rval;
-
-    if ( (rval = verify_config(sc)) )
-        return rval;
-
-#if 0
-    // FIXIT no longer valid with thread local flow_con instantiated later
-    // also, how is this possible?
-    // if just due to failed alloc, then delete
-    uint32_t max_tcp = flow_con->max_flows(IPPROTO_TCP);
-    uint32_t max_udp = flow_con->max_flows(IPPROTO_UDP);
-    uint32_t max_icmp = flow_con->max_flows(IPPROTO_ICMP);
-    uint32_t max_ip = flow_con->max_flows(IPPROTO_IP);
-
-    uint32_t total_sessions = max_tcp + max_udp + max_icmp + max_ip;
-
-    if ( !total_sessions )
-        return 0;
-
-    if ( (config.global_config->max_tcp_sessions > 0)
-        && (max_tcp == 0) )
-    {
-        LogMessage("TCP tracking disabled, no TCP sessions allocated\n");
-    }
-
-    if ( (config.global_config->max_udp_sessions > 0)
-        && (max_udp == 0) )
-    {
-        LogMessage("UDP tracking disabled, no UDP sessions allocated\n");
-    }
-
-    if ( (config.global_config->max_icmp_sessions > 0)
-        && (max_icmp == 0) )
-    {
-        LogMessage("ICMP tracking disabled, no ICMP sessions allocated\n");
-    }
-
-    if ( (config.global_config->max_ip_sessions > 0)
-        && (max_ip == 0) )
-    {
-        LogMessage("IP tracking disabled, no IP sessions allocated\n");
-    }
-
-    // FIXIT need to get max or set it here for use by init_exp
-    //LogMessage("      Max Expected Streams: %u\n", max);
-#endif
-    return 0;
-}
-
-void Stream5::init()
+void Stream5::pinit()
 {
     assert(!flow_con);
     flow_con = new FlowControl(&config);
@@ -357,7 +311,7 @@ void Stream5::init()
     tcp_sinit(&config);
 }
 
-void Stream5::term()
+void Stream5::pterm()
 {
 #ifdef ENABLE_HA
     Stream5CleanHA();
@@ -369,14 +323,6 @@ void Stream5::term()
     tcp_sterm();
 }
 
-void Stream5::setup(SnortConfig*)
-{
-#ifdef ENABLE_HA
-    if ( config.ha_config )
-        ha_setup(config.ha_config);
-#endif
-}
-
 void Stream5::show(SnortConfig*)
 {
     Stream5PrintGlobalConfig(&config);
@@ -594,7 +540,7 @@ static void s5_term(void* pv)
 }
 #endif
 
-static void s5_purge(void*)
+static void s5_purge()
 {
     flow_con->purge_flows(IPPROTO_TCP);
     flow_con->purge_flows(IPPROTO_UDP);
@@ -602,12 +548,7 @@ static void s5_purge(void*)
     flow_con->purge_flows(IPPROTO_IP);
 }
 
-static void s5_stop(void* pv)
-{
-    s5_purge(pv);
-}
-
-static void s5_sum(void*)
+static void s5_sum()
 {
     sum_stats((PegCount*)&gs5stats.tcp_port_filter,
         (PegCount*)&s5stats.tcp_port_filter, array_size(filter_pegs));
@@ -621,7 +562,7 @@ static void s5_sum(void*)
     ip_sum();
 }
 
-static void s5_stats(void*)
+static void s5_stats()
 {
     tcp_stats();
 
@@ -649,7 +590,7 @@ static void s5_stats(void*)
 #endif
 }
 
-static void s5_reset(void*)
+static void s5_reset()
 {
     tcp_reset_stats();
     udp_reset_stats();
@@ -692,7 +633,8 @@ static const InspectApi s5_api =
     nullptr, // term
     s5_ctor,
     s5_dtor,
-    s5_stop,
+    nullptr, // pinit
+    nullptr, // pterm
     s5_purge,
     s5_sum,
     s5_stats,
index 105c6f77b9a3f62266793876961080f3c57db000..496aeb765d1c5ce7348263a55dd0990157a75a1d 100644 (file)
@@ -454,16 +454,12 @@ static int BoGetDirection(Packet *p, char *pkt_data)
 
 class BoPH : public Inspector {
 public:
-    BoPH();
+    BoPH() { };
 
     void show(SnortConfig*);
     void eval(Packet*);
 };
 
-BoPH::BoPH()
-{
-}
-
 void BoPH::show(SnortConfig*)
 {
     LogMessage("%s\n", mod_name);
@@ -604,17 +600,17 @@ static void bo_dtor(Inspector* p)
     delete p;
 }
 
-static void bo_sum(void*)
+static void bo_sum()
 {
     sum_stats(&gbostats, &bostats);
 }
 
-static void bo_stats(void*)
+static void bo_stats()
 {
     show_stats(&gbostats, mod_name);
 }
 
-static void bo_reset(void*)
+static void bo_reset()
 {
     memset(&gbostats, 0, sizeof(gbostats));
 }
@@ -635,7 +631,8 @@ static const InspectApi bo_api =
     nullptr, // term
     bo_ctor,
     bo_dtor,
-    nullptr, // stop
+    nullptr, // pinit
+    nullptr, // pterm
     nullptr, // purge
     bo_sum,
     bo_stats,
index 29c9d4b79ab5c911afd082ad2968bfa5d6c5eb17..cc1a7601f22e889d9cff4caa9765850b5fbd80cf 100644 (file)
@@ -525,8 +525,7 @@ public:
     FtpServer(FTP_SERVER_PROTO_CONF*);
     ~FtpServer();
 
-    void configure(SnortConfig*);
-    int verify(SnortConfig*);
+    bool configure(SnortConfig*);
     void show(SnortConfig*);
     void eval(Packet*);
     void eval_alt(Packet*);
@@ -552,7 +551,7 @@ FtpServer::~FtpServer ()
         Share::release(ftp_client);
 }
 
-void FtpServer::configure (SnortConfig* sc)
+bool FtpServer::configure (SnortConfig* sc)
 {
     ftp_client = (ClientData*)Share::acquire(client_key);
 
@@ -561,11 +560,8 @@ void FtpServer::configure (SnortConfig* sc)
 
     bind_server = ftp_server;
     bind_client = ftp_client->data;
-}
 
-int FtpServer::verify(SnortConfig* sc)
-{
-    return FTPCheckConfigs(sc, ftp_server);
+    return !FTPCheckConfigs(sc, ftp_server);
 }
 
 void FtpServer::show(SnortConfig*)
@@ -695,17 +691,17 @@ static void fs_dtor(Inspector* p)
     delete p;
 }
 
-static void fs_sum(void*)
+static void fs_sum()
 {
     sum_stats(&gftstats, &ftstats);
 }
 
-static void fs_stats(void*)
+static void fs_stats()
 {
     show_stats(&gftstats, server_key);
 }
 
-static void fs_reset(void*)
+static void fs_reset()
 {
     memset(&gftstats, 0, sizeof(gftstats));
 }
@@ -726,7 +722,8 @@ static const InspectApi fs_api =
     nullptr, // term
     fs_ctor,
     fs_dtor,
-    nullptr, // stop
+    nullptr, // pinit
+    nullptr, // pterm
     nullptr, // purge
     fs_sum,
     fs_stats,
index 8a0c601990535724a202a4b03f5e598335008c30..101e91dccf7031a38f84e746c31f0dab538c0726 100644 (file)
@@ -271,8 +271,7 @@ public:
     Telnet(TELNET_PROTO_CONF*);
     ~Telnet();
 
-    void configure(SnortConfig*);
-    int verify(SnortConfig*);
+    bool configure(SnortConfig*);
     void show(SnortConfig*);
     void eval(Packet*);
 
@@ -291,15 +290,12 @@ Telnet::~Telnet()
         delete config;
 }
 
-void Telnet::configure(SnortConfig* sc)
+bool Telnet::configure(SnortConfig* sc)
 {
     stream.set_service_filter_status(
         sc, telnet_app_id, PORT_MONITOR_SESSION);
-}
 
-int Telnet::verify(SnortConfig* sc)
-{
-    return TelnetCheckConfigs(sc, config);
+    return !TelnetCheckConfigs(sc, config);
 }
 
 void Telnet::show(SnortConfig*)
@@ -342,17 +338,17 @@ static void tn_dtor(Inspector* p)
     delete p;
 }
 
-static void tn_sum(void*)
+static void tn_sum()
 {
     sum_stats(&gtnstats, &tnstats);
 }
 
-static void tn_stats(void*)
+static void tn_stats()
 {
     show_stats(&gtnstats, tn_name);
 }
 
-static void tn_reset(void*)
+static void tn_reset()
 {
     memset(&gtnstats, 0, sizeof(gtnstats));
 }
@@ -374,7 +370,8 @@ const InspectApi tn_api =
     nullptr, // term
     tn_ctor,
     tn_dtor,
-    nullptr, // stop
+    nullptr, // pinit
+    nullptr, // pterm
     nullptr, // purge
     tn_sum,
     tn_stats,
index 7352216a4f954786881dab018ef83274e7d8dbef..4e2a590b93a04f6bb771eb0fe019c5c388486e8c 100644 (file)
@@ -1,6 +1,6 @@
 /****************************************************************************
  *
-** Copyright (C) 2014 Cisco and/or its affiliates. All rights reserved.
+ * Copyright (C) 2014 Cisco and/or its affiliates. All rights reserved.
  * Copyright (C) 2003-2013 Sourcefire, Inc.
  *
  * This program is free software; you can redistribute it and/or modify
@@ -529,12 +529,13 @@ public:
     HttpInspect(HTTPINSPECT_CONF*);
     ~HttpInspect();
 
-    void configure(SnortConfig*);
-    int verify(SnortConfig*);
+    bool configure(SnortConfig*);
     void show(SnortConfig*);
+
     void eval(Packet*);
-    void init();
-    void term();
+
+    void pinit();
+    void pterm();
 
 private:
     HTTPINSPECT_CONF* config;
@@ -556,7 +557,7 @@ HttpInspect::~HttpInspect ()
         Share::release(global);
 }
 
-void HttpInspect::configure (SnortConfig* sc)
+bool HttpInspect::configure (SnortConfig* sc)
 {
     global = (HttpData*)Share::acquire(GLOBAL_KEYWORD);
     config->global = global->data;
@@ -569,14 +570,11 @@ void HttpInspect::configure (SnortConfig* sc)
     // FIXIT must load default unicode map from const char*
     CheckGzipConfig(config->global);
     CheckMemcap(config->global);
-}
 
-int HttpInspect::verify(SnortConfig* sc)
-{
-    return HttpInspectVerifyPolicy(sc, config);
+    return !HttpInspectVerifyPolicy(sc, config);
 }
 
-void HttpInspect::init()
+void HttpInspect::pinit()
 {
     memset(&hi_stats, 0, sizeof(HIStats));
 
@@ -633,7 +631,7 @@ void HttpInspect::init()
     }
 }
 
-void HttpInspect::term()
+void HttpInspect::pterm()
 {
     // FIXIT this is off-balance; not allocated by sinit()
     if ( hi_gzip_mempool && !mempool_destroy(hi_gzip_mempool) )
@@ -778,18 +776,18 @@ static void hs_dtor(Inspector* p)
     delete p;
 }
 
-static void hs_sum(void*)
+static void hs_sum()
 {
     sum_stats((PegCount*)&ghi_stats, (PegCount*)&hi_stats, array_size(peg_names));
 }
 
-static void hs_stats(void*)
+static void hs_stats()
 {
     show_stats((PegCount*)&ghi_stats, peg_names, array_size(peg_names),
         SERVER_KEYWORD);
 }
 
-static void hs_reset(void*)
+static void hs_reset()
 {
     memset(&ghi_stats, 0, sizeof(ghi_stats));
 }
@@ -812,7 +810,8 @@ static const InspectApi hs_api =
     hs_term,
     hs_ctor,
     hs_dtor,
-    nullptr, // stop
+    nullptr, // pinit
+    nullptr, // pterm
     nullptr, // purge
     hs_sum,
     hs_stats,
index f35df646364bcf5a7d99204c80513baa50c4bdaf..bc1aa085e575e9cf495e9bea530f3037a91a6ee3 100644 (file)
@@ -1051,7 +1051,7 @@ class RpcDecode : public Inspector {
 public:
     RpcDecode(RpcModule*);
 
-    void configure(SnortConfig*);
+    bool configure(SnortConfig*);
     void show(SnortConfig*);
     void eval(Packet*);
 
@@ -1064,10 +1064,11 @@ RpcDecode::RpcDecode(RpcModule* mod)
     mod->get_ports(config.ports);
 }
 
-void RpcDecode::configure(SnortConfig* sc)
+bool RpcDecode::configure(SnortConfig* sc)
 {
     _addPortsToStream5Filter(sc, &config);
     _addServicesToStream5Filter(sc);
+    return true;
 }
 
 void RpcDecode::show(SnortConfig*)
@@ -1185,17 +1186,17 @@ static void rd_dtor(Inspector* p)
     delete p;
 }
 
-static void rd_sum(void*)
+static void rd_sum()
 {
     sum_stats(&grdstats, &rdstats);
 }
 
-static void rd_stats(void*)
+static void rd_stats()
 {
     show_stats(&grdstats, mod_name);
 }
 
-static void rd_reset(void*)
+static void rd_reset()
 {
     memset(&grdstats, 0, sizeof(grdstats));
 }
@@ -1216,7 +1217,8 @@ static const InspectApi rd_api =
     nullptr, // term
     rd_ctor,
     rd_dtor,
-    nullptr, // stop
+    nullptr, // pinit
+    nullptr, // pterm
     nullptr, // purge
     rd_sum,
     rd_stats,
index 7d59d156230c114e8f3881bcf6e44151225ac442..620d9bded8ea888356a01710699a7f219676b629 100644 (file)
@@ -381,7 +381,9 @@ static void SnortInit(int argc, char **argv)
     {
         OrderRuleLists(snort_conf, "activation dynamic drop sdrop reject alert pass log");
     }
-    InspectorManager::configure(snort_conf);
+    if ( !InspectorManager::configure(snort_conf) )
+        SnortFatalExit();
+
     InspectorManager::print_config(snort_conf); // FIXIT make optional
 
     ParseRules(snort_conf);
@@ -398,10 +400,6 @@ static void SnortInit(int argc, char **argv)
      */
     SetRuleStates(snort_conf);
 
-    /* Verify the preprocessors are configured properly */
-    if (InspectorManager::check_config(snort_conf))
-        SnortFatalExit();
-
     SetPortFilterLists(snort_conf);  // FIXIT need to do these on reload?
     InitServiceFilterStatus(snort_conf);
 
@@ -682,7 +680,11 @@ static SnortConfig * get_reload_config(void)
         sc->thiszone = gmt2local(0);
 #endif
 
-    InspectorManager::configure(sc);
+    if ( !InspectorManager::configure(sc) )
+    {
+        SnortConfFree(sc);
+        return NULL;
+    }
 
     FlowbitResetCounts();
     ParseRules(sc);
@@ -694,15 +696,7 @@ static SnortConfig * get_reload_config(void)
     //PrintRuleOrder(sc->rule_lists);
 
     SetRuleStates(sc);
-
-    if (InspectorManager::check_config(sc))
-    {
-        SnortConfFree(sc);
-        return NULL;
-    }
-
     SetPortFilterLists(sc);
-    InspectorManager::post_config(sc);
 
     /* Need to do this after dynamic detection stuff is initialized, too */
     IpsManager::verify();