]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Merge pull request #2749 in SNORT/snort3 from ~SHRARANG/snort3:appid_remove_forecast...
authorShravan Rangarajuvenkata (shrarang) <shrarang@cisco.com>
Thu, 18 Feb 2021 19:51:10 +0000 (19:51 +0000)
committerShravan Rangarajuvenkata (shrarang) <shrarang@cisco.com>
Thu, 18 Feb 2021 19:51:10 +0000 (19:51 +0000)
Squashed commit of the following:

commit 8b16b5b54d078478ddffa3b4899b68eda7a4641d
Author: Shravan Rangaraju <shrarang@cisco.com>
Date:   Fri Feb 12 17:17:55 2021 -0500

    appid: remove app forecast method

19 files changed:
src/network_inspectors/appid/CMakeLists.txt
src/network_inspectors/appid/app_forecast.cc [deleted file]
src/network_inspectors/appid/app_forecast.h [deleted file]
src/network_inspectors/appid/appid_config.cc
src/network_inspectors/appid/appid_config.h
src/network_inspectors/appid/appid_discovery.cc
src/network_inspectors/appid/appid_discovery.h
src/network_inspectors/appid/appid_inspector.cc
src/network_inspectors/appid/appid_module.cc
src/network_inspectors/appid/appid_session.cc
src/network_inspectors/appid/appid_session.h
src/network_inspectors/appid/detector_plugins/test/detector_plugins_mock.h
src/network_inspectors/appid/lua_detector_api.cc
src/network_inspectors/appid/service_plugins/test/service_plugin_mock.h
src/network_inspectors/appid/test/appid_debug_test.cc
src/network_inspectors/appid/test/appid_http_session_test.cc
src/network_inspectors/appid/test/appid_mock_session.h
src/network_inspectors/appid/test/service_state_test.cc
src/network_inspectors/appid/test/tp_lib_handler_test.cc

index 5e9c8a4027ca7b45ff7c4cc4fecb9a3c923d987c..151ffaaec561ed0338c7209b62c3c82205d03187 100644 (file)
@@ -139,8 +139,6 @@ set ( UTIL_APPID_SOURCES
 )
 
 set ( APPID_SOURCES
-    app_forecast.cc
-    app_forecast.h
     appid_api.cc
     appid_api.h
     appid_app_descriptor.cc
diff --git a/src/network_inspectors/appid/app_forecast.cc b/src/network_inspectors/appid/app_forecast.cc
deleted file mode 100644 (file)
index e87674f..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-//--------------------------------------------------------------------------
-// Copyright (C) 2014-2020 Cisco and/or its affiliates. All rights reserved.
-// Copyright (C) 2005-2013 Sourcefire, Inc.
-//
-// This program is free software; you can redistribute it and/or modify it
-// under the terms of the GNU General Public License Version 2 as published
-// by the Free Software Foundation.  You may not use, modify or distribute
-// this program under any other version of the GNU General Public License.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License along
-// with this program; if not, write to the Free Software Foundation, Inc.,
-// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-//--------------------------------------------------------------------------
-
-// app_forecast.cc author Sourcefire Inc.
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "app_forecast.h"
-#include "appid_inspector.h"
-
-#include "log/messages.h"
-#include "time/packet_time.h"
-#include "appid_session.h"
-
-using namespace snort;
-
-void check_session_for_AF_indicator(Packet* p, AppidSessionDirection dir, AppId indicator, const OdpContext& odp_ctxt)
-{
-    const std::unordered_map<int, AFElement>& AF_indicators = odp_ctxt.get_af_indicators();
-    auto af_indicator_entry = AF_indicators.find(indicator);
-
-    if (af_indicator_entry == AF_indicators.end())
-        return;
-
-    AFElement ind_element = af_indicator_entry->second;
-    AFActKey master_key(p, dir, ind_element.forecast);
-
-    AFActVal new_active_value = AFActVal(ind_element.target, packet_time());
-
-    odp_thread_local_ctxt->add_af_actives(master_key, new_active_value);
-}
-
-AppId check_session_for_AF_forecast(AppIdSession& asd, Packet* p, AppidSessionDirection dir, AppId forecast)
-{
-    AFActKey master_key(p, dir, forecast);
-
-    //get out if there is no value
-    std::map<AFActKey, AFActVal>* AF_actives = odp_thread_local_ctxt->get_af_actives();
-    assert(AF_actives);
-    auto check_act_val = AF_actives->find(master_key);
-    if (check_act_val == AF_actives->end())
-        return APP_ID_UNKNOWN;
-
-    //if the value is older than 5 minutes, remove it and get out
-    time_t age = packet_time() - check_act_val->second.last;
-    if (age < 0 || age > 300)
-    {
-        odp_thread_local_ctxt->erase_af_actives(master_key);
-        return APP_ID_UNKNOWN;
-    }
-    asd.set_payload_id(check_act_val->second.target);
-    return forecast;
-}
-
diff --git a/src/network_inspectors/appid/app_forecast.h b/src/network_inspectors/appid/app_forecast.h
deleted file mode 100644 (file)
index 2f383f0..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-//--------------------------------------------------------------------------
-// Copyright (C) 2014-2020 Cisco and/or its affiliates. All rights reserved.
-// Copyright (C) 2005-2013 Sourcefire, Inc.
-//
-// This program is free software; you can redistribute it and/or modify it
-// under the terms of the GNU General Public License Version 2 as published
-// by the Free Software Foundation.  You may not use, modify or distribute
-// this program under any other version of the GNU General Public License.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License along
-// with this program; if not, write to the Free Software Foundation, Inc.,
-// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-//--------------------------------------------------------------------------
-
-// app_forecast.h author Sourcefire Inc.
-
-#ifndef APP_FORECAST_H
-#define APP_FORECAST_H
-
-#include <ctime>
-
-#include "flow/flow.h"
-#include "protocols/packet.h"
-#include "utils/cpp_macros.h"
-
-#include "appid_types.h"
-#include "application_ids.h"
-
-class AppIdSession;
-class OdpContext;
-namespace snort
-{
-struct Packet;
-}
-
-// indicator - the appId that indicates there may be subsequent flows to look for,
-// from the same host
-// forecast - the appId in the subsequent flow that we are looking for
-// target - the appId we want to set in that subsequent flow
-//
-// for now, indicator and target are WEB APPLICATIONS. The forecast is APP PROTOCOL.
-// We can change this later by adding app type info for each, if we find a use case.
-
-struct AFElement
-{
-    AFElement(AppId forecast, AppId target) : forecast(forecast), target(target) { }
-
-    AppId forecast;
-    AppId target;
-};
-
-PADDING_GUARD_BEGIN
-class AFActKey
-{
-    public:
-        AFActKey(snort::Packet* p, AppidSessionDirection dir, AppId forecast) :
-            forecast(forecast)
-        {
-            const snort::SfIp* src = dir ? p->ptrs.ip_api.get_dst() : p->ptrs.ip_api.get_src();
-
-            memcpy(ip, src->get_ip6_ptr(), sizeof(ip));
-        }
-
-        bool operator<(const AFActKey &key) const
-        {
-            return (forecast < key.forecast || ip[0] < key.ip[0] ||
-                   ip[1] < key.ip[1] || ip[2] < key.ip[2] || ip[3] < key.ip[3]);
-        }
-    private:
-        uint32_t ip[4];
-        AppId forecast;
-};
-PADDING_GUARD_END
-
-struct AFActVal
-{
-    AFActVal(AppId target, time_t last) : target(target), last(last) { }
-
-    AppId target;
-    time_t last;
-};
-
-void check_session_for_AF_indicator(snort::Packet*, AppidSessionDirection, AppId, const OdpContext&);
-AppId check_session_for_AF_forecast(AppIdSession&, snort::Packet*, AppidSessionDirection, AppId);
-
-#endif
-
index 0a3b92828881781dd3a011b76a0393599d5820d6..5fe5daa6df429ba7d5630ab010349f8cea1e85c6 100644 (file)
@@ -28,7 +28,6 @@
 #include <glob.h>
 #include <climits>
 
-#include "app_forecast.h"
 #include "app_info_table.h"
 #include "appid_discovery.h"
 #include "appid_http_session.h"
@@ -108,7 +107,7 @@ bool AppIdContext::init_appid(SnortConfig* sc)
         odp_ctxt = new OdpContext(config, sc);
 
     if (!odp_thread_local_ctxt)
-        odp_thread_local_ctxt = new OdpThreadContext(true);
+        odp_thread_local_ctxt = new OdpThreadContext;
 
     static bool once = false;
     if (!once)
@@ -159,11 +158,6 @@ OdpContext::OdpContext(const AppIdConfig& config, SnortConfig* sc)
     version = next_version++;
 }
 
-OdpContext::~OdpContext()
-{
-    AF_indicators.clear();
-}
-
 void OdpContext::initialize()
 {
     service_pattern_detector->finalize_service_port_patterns();
@@ -225,26 +219,6 @@ AppId OdpContext::get_protocol_service_id(IpProtocol proto)
     return ip_protocol[(uint16_t)proto];
 }
 
-void OdpContext::add_af_indicator(AppId indicator, AppId forecast, AppId target)
-{
-    if (AF_indicators.find(indicator) != AF_indicators.end())
-    {
-        ErrorMessage("LuaDetectorApi:Attempt to add more than one AFElement per appId %d",
-            indicator);
-        return;
-    }
-
-    AFElement val = AFElement(forecast, target);
-    if (false == AF_indicators.emplace(indicator, val).second)
-        ErrorMessage("LuaDetectorApi:Failed to add AFElement for appId %d", indicator);
-}
-
-OdpThreadContext::OdpThreadContext(bool is_control)
-{
-    if (!is_control)
-        AF_actives = new std::map<AFActKey, AFActVal>;
-}
-
 void OdpThreadContext::initialize(AppIdContext& ctxt, bool is_control, bool reload_odp)
 {
     if (!is_control and reload_odp)
@@ -257,10 +231,4 @@ OdpThreadContext::~OdpThreadContext()
 {
     assert(lua_detector_mgr);
     delete lua_detector_mgr;
-
-    if (AF_actives != nullptr)
-    {
-        AF_actives->clear();
-        delete AF_actives;
-    }
 }
index 0a12c658c953c1ad72d206875112e22366193995..20bd67a7ad58bd225c86fd1158bd26f7008f7b71 100644 (file)
@@ -27,7 +27,6 @@
 
 #include "target_based/snort_protocols.h"
 
-#include "app_forecast.h"
 #include "app_info_table.h"
 #include "client_plugins/client_discovery.h"
 #include "detector_plugins/dns_patterns.h"
@@ -119,7 +118,6 @@ public:
     uint16_t max_packet_service_fail_ignore_bytes = MIN_MAX_PKT_BEFORE_SERVICE_FAIL_IGNORE_BYTES;
 
     OdpContext(const AppIdConfig&, snort::SnortConfig*);
-    ~OdpContext();
     void initialize();
     void reload();
 
@@ -194,16 +192,10 @@ public:
         return *service_pattern_detector;
     }
 
-    const std::unordered_map<AppId, AFElement>& get_af_indicators() const
-    {
-        return AF_indicators;
-    }
-
     void add_port_service_id(IpProtocol, uint16_t, AppId);
     void add_protocol_service_id(IpProtocol, AppId);
     AppId get_port_service_id(IpProtocol, uint16_t);
     AppId get_protocol_service_id(IpProtocol);
-    void add_af_indicator(AppId, AppId, AppId);
 
 private:
     AppInfoManager app_info_mgr;
@@ -217,7 +209,6 @@ private:
     SslPatternMatchers ssl_matchers;
     PatternClientDetector* client_pattern_detector;
     PatternServiceDetector* service_pattern_detector;
-    std::unordered_map<AppId, AFElement> AF_indicators;     // list of "indicator apps"
 
     std::array<AppId, APP_ID_PORT_ARRAY_SIZE> tcp_port_only = {}; // port-only TCP services
     std::array<AppId, APP_ID_PORT_ARRAY_SIZE> udp_port_only = {}; // port-only UDP services
@@ -230,7 +221,6 @@ private:
 class OdpThreadContext
 {
 public:
-    OdpThreadContext(bool is_control=false);
     ~OdpThreadContext();
     void initialize(AppIdContext& ctxt, bool is_control=false, bool reload_odp=false);
 
@@ -245,26 +235,8 @@ public:
         return *lua_detector_mgr;
     }
 
-    std::map<AFActKey, AFActVal>* get_af_actives() const
-    {
-        return AF_actives;
-    }
-
-    void add_af_actives(AFActKey key, AFActVal value)
-    {
-        assert(AF_actives);
-        AF_actives->emplace(key, value);
-    }
-
-    void erase_af_actives(AFActKey key)
-    {
-        assert(AF_actives);
-        AF_actives->erase(key);
-    }
-
 private:
     LuaDetectorManager* lua_detector_mgr = nullptr;
-    std::map<AFActKey, AFActVal>* AF_actives = nullptr; // list of hosts to watch
 };
 
 class AppIdContext
index 0a53fc23d917a75268a4eb8e823506571da5f39a..27be6db79e9eedac01e5e571c3636f25c7dc521a 100644 (file)
@@ -31,7 +31,6 @@
 #include "protocols/packet.h"
 #include "protocols/tcp.h"
 
-#include "app_forecast.h"
 #include "appid_config.h"
 #include "appid_debug.h"
 #include "appid_detector.h"
@@ -124,8 +123,8 @@ void AppIdDiscovery::do_application_discovery(Packet* p, AppIdInspector& inspect
     bool is_discovery_done = do_discovery(p, *asd, protocol, outer_protocol, direction, service_id,
         client_id, payload_id, misc_id, change_bits, tp_appid_ctxt);
 
-    do_post_discovery(p, *asd, direction, is_discovery_done, service_id, client_id, payload_id,
-        misc_id, change_bits);
+    do_post_discovery(p, *asd, is_discovery_done, service_id, client_id, payload_id, misc_id,
+        change_bits);
 }
 
 static inline unsigned get_ipfuncs_flags(const Packet* p, bool dst)
@@ -859,8 +858,8 @@ bool AppIdDiscovery::do_discovery(Packet* p, AppIdSession& asd, IpProtocol proto
 }
 
 void AppIdDiscovery::do_post_discovery(Packet* p, AppIdSession& asd,
-    AppidSessionDirection direction, bool is_discovery_done, AppId service_id,
-    AppId client_id, AppId payload_id, AppId misc_id, AppidChangeBits& change_bits)
+    bool is_discovery_done, AppId service_id, AppId client_id, AppId payload_id, AppId misc_id,
+    AppidChangeBits& change_bits)
 {
     if (service_id > APP_ID_NONE)
     {
@@ -876,23 +875,6 @@ void AppIdDiscovery::do_post_discovery(Packet* p, AppIdSession& asd,
             asd.set_session_flags(APPID_SESSION_CONTINUE);
     }
 
-    if (service_id !=  APP_ID_NONE)
-    {
-        if (payload_id != asd.past_indicator and payload_id != APP_ID_NONE)
-        {
-            asd.past_indicator = payload_id;
-            check_session_for_AF_indicator(p, direction, (AppId)payload_id, asd.get_odp_ctxt());
-        }
-
-        if (asd.past_forecast != service_id and asd.past_forecast != APP_ID_UNKNOWN and
-             asd.get_payload_id() == APP_ID_NONE)
-        {
-            asd.past_forecast = check_session_for_AF_forecast(asd, p, direction, service_id);
-            if (asd.past_forecast != APP_ID_UNKNOWN)
-                payload_id = asd.pick_ss_payload_app_id(service_id);
-        }
-    }
-
     if (asd.get_session_flags(APPID_SESSION_OOO_CHECK_TP) and asd.tpsession and
         (asd.scan_flags & SCAN_HOST_PORT_FLAG) and (service_id or payload_id))
     {
index 845e92414b4d0df3133c8c27dcbd10dcad890fcc..ef790892c3eba865d05b7cdcb712b1d16cbc97b2 100644 (file)
@@ -144,8 +144,8 @@ private:
         AppId& client_id, AppId& payload_id, AppId& misc_id, AppidChangeBits& change_bits,
         ThirdPartyAppIdContext* tp_appid_ctxt);
     static void do_post_discovery(snort::Packet* p, AppIdSession& asd,
-        AppidSessionDirection direction, bool is_discovery_done, AppId service_id, AppId client_id,
-        AppId payload_id, AppId misc_id, AppidChangeBits& change_bits);
+        bool is_discovery_done, AppId service_id, AppId client_id, AppId payload_id, AppId misc_id,
+        AppidChangeBits& change_bits);
     static void do_port_based_discovery(snort::Packet* p, AppIdSession& asd, IpProtocol protocol,
         AppidSessionDirection direction);
     static bool do_host_port_based_discovery(snort::Packet* p, AppIdSession& asd,
index df0504b73dd55f952f0250374a51d4fdcbd0531e..767a670babedfc8eae3595e3f2cdcf890f4a2e15 100644 (file)
@@ -34,7 +34,6 @@
 #include "packet_tracer/packet_tracer.h"
 #include "profiler/profiler.h"
 
-#include "app_forecast.h"
 #include "appid_data_decrypt_event_handler.h"
 #include "appid_dcerpc_event_handler.h"
 #include "appid_debug.h"
index 788875ec86657bc54a0e6a512d80f38d5c4ca20a..56f8a5ff946c7a518d385ccbc9e7d6951d220633 100644 (file)
@@ -246,7 +246,7 @@ bool ACOdpContextSwap::execute(Analyzer&, void**)
     pkt_thread_odp_ctxt = &current_odp_ctxt;
     assert(odp_thread_local_ctxt);
     delete odp_thread_local_ctxt;
-    odp_thread_local_ctxt = new OdpThreadContext();
+    odp_thread_local_ctxt = new OdpThreadContext;
     odp_thread_local_ctxt->initialize(ctxt, false, true);
     return true;
 }
@@ -375,7 +375,7 @@ static int reload_detectors(lua_State* L)
     ctxt.create_odp_ctxt();
     assert(odp_thread_local_ctxt);
     delete odp_thread_local_ctxt;
-    odp_thread_local_ctxt = new OdpThreadContext(true);
+    odp_thread_local_ctxt = new OdpThreadContext;
 
     OdpContext& odp_ctxt = ctxt.get_odp_ctxt();
     odp_ctxt.get_client_disco_mgr().initialize();
index b3fbe470398249790c24c7733e79d0d78a36398e..d196ad623fc38b30c4be678e33f52b5b5eeb9bc6 100644 (file)
@@ -38,7 +38,6 @@
 #include "target_based/snort_protocols.h"
 #include "time/packet_time.h"
 
-#include "app_forecast.h"
 #include "app_info_table.h"
 #include "appid_config.h"
 #include "appid_debug.h"
index 1f4360092a7af8f10a5423ccc39dd4309e00a159..fd5886da977876a2405dbdba610810b51c78387d 100644 (file)
@@ -308,9 +308,6 @@ public:
         AppId referred_id;
     } encrypted = { APP_ID_NONE, APP_ID_NONE, APP_ID_NONE, APP_ID_NONE, APP_ID_NONE };
 
-    AppId past_indicator = APP_ID_NONE;
-    AppId past_forecast = APP_ID_NONE;
-
     bool in_expected_cache = false;
     static unsigned inspector_id;
     static std::mutex inferred_svcs_lock;
index 861ef9e51d51ff652641bba916701ac793307e42..801a262b40c0b2ba8e0df3dbe6b9ce388071aefa 100644 (file)
@@ -224,6 +224,5 @@ int ServiceDiscovery::add_service_port(AppIdDetector*, const ServiceDetectorPort
 
 OdpContext::OdpContext(const AppIdConfig&, snort::SnortConfig*)
 { }
-OdpContext::~OdpContext() { }
 
 #endif
index 7ed533a8445d7b844187aff09d5c5e26f85c543b..beb28cde3d897d328d9b041c585cc0e0af96bc0b 100644 (file)
@@ -34,7 +34,6 @@
 #include "profiler/profiler.h"
 #include "protocols/packet.h"
 
-#include "app_forecast.h"
 #include "app_info_table.h"
 #include "appid_debug.h"
 #include "appid_inspector.h"
@@ -1842,23 +1841,6 @@ static int detector_add_length_app_cache(lua_State* L)
     return 1;
 }
 
-static int detector_add_af_application(lua_State* L)
-{
-    auto& ud = *UserData<LuaObject>::check(L, DETECTOR, 1);
-    // Verify detector user data and that we are NOT in packet context
-    ud->validate_lua_state(false);
-    if (!init(L)) return 0;
-
-    int index = 1;
-
-    AppId indicator = (AppId)lua_tointeger(L, ++index);
-    AppId forecast  = (AppId)lua_tointeger(L, ++index);
-    AppId target    = (AppId)lua_tointeger(L, ++index);
-    ud->get_odp_ctxt().add_af_indicator(indicator, forecast, target);
-
-    return 0;
-}
-
 static int detector_add_url_application(lua_State* L)
 {
     // Verify detector user data and that we are NOT in packet context
@@ -2691,9 +2673,6 @@ static const luaL_Reg detector_methods[] =
                                                                            // same appId
     { "CHPMultiAddAction",        detector_add_chp_multi_action },
 
-    //App Forecasting engine
-    { "AFAddApp",                 detector_add_af_application },
-
     { "portOnlyService",          detector_port_only_service },
 
     /* Length-based detectors. */
index 6df7daa5b67aca997237e078d0b24a360f83e17c..16edfde294920f3fdd32bacba4c1e30c73d05197 100644 (file)
@@ -212,6 +212,4 @@ void ServiceDiscoveryState::set_service_id_valid(ServiceDetector*) { }
 OdpContext::OdpContext(const AppIdConfig&, snort::SnortConfig*)
 { }
 
-OdpContext::~OdpContext() { }
-
 #endif
index 5c9592b08ae260748bf274080b9fea60f757f10b..9b14e74950a818d2601cf4fcb161a730e5df63bb 100644 (file)
@@ -56,7 +56,6 @@ public:
 
 AppIdConfig::~AppIdConfig() { }
 OdpContext::OdpContext(const AppIdConfig&, snort::SnortConfig*) { }
-OdpContext::~OdpContext() { }
 
 AppIdConfig stub_config;
 AppIdContext stub_ctxt(stub_config);
index b23f4e528d36abdcd168f74a825b1ce41a479d92..e3629a63ba5d7773c29e976151aad0eb714cfdda 100644 (file)
@@ -169,7 +169,6 @@ void memory::MemoryCap::update_allocations(size_t) { }
 void memory::MemoryCap::update_deallocations(size_t) { }
 
 OdpContext::OdpContext(const AppIdConfig&, snort::SnortConfig*) { }
-OdpContext::~OdpContext() { }
 
 AppIdConfig::~AppIdConfig() { }
 
index b647ac93e158dda1510d8d5daadbd28986b15d3d..2074f5f8eff58512fd1bf83806b45f29092c6d56 100644 (file)
@@ -73,7 +73,6 @@ public:
 
 AppIdConfig::~AppIdConfig() { }
 OdpContext::OdpContext(const AppIdConfig&, snort::SnortConfig*) { }
-OdpContext::~OdpContext() { }
 
 void FlowHAState::add(uint8_t) { }
 
index ed16c4519e9c2c7576a39ebaaa9bc34ed2f8ba55..ddea1ab07c2e3b5284d7a80abd5d9d337c9caae1 100644 (file)
@@ -84,7 +84,6 @@ void ClientAppDescriptor::update_stats(AppId, bool) {}
 void PayloadAppDescriptor::update_stats(AppId, bool) {}
 AppIdConfig::~AppIdConfig() { }
 OdpContext::OdpContext(const AppIdConfig&, snort::SnortConfig*) { }
-OdpContext::~OdpContext() { }
 AppIdConfig stub_config;
 AppIdContext stub_ctxt(stub_config);
 OdpContext stub_odp_ctxt(stub_config, nullptr);
index 46d17b618478037bbb58ad836425447988e51d89..bd14e012346cdd5b1deefa58303cfbf08b545c84 100644 (file)
@@ -60,7 +60,6 @@ SipPatternMatchers::~SipPatternMatchers() { }
 SslPatternMatchers::~SslPatternMatchers() { }
 AppIdConfig::~AppIdConfig() { }
 OdpContext::OdpContext(const AppIdConfig&, snort::SnortConfig*) { }
-OdpContext::~OdpContext() { }
 void ServiceDiscovery::initialize() { }
 void ServiceDiscovery::reload() { }
 int ServiceDiscovery::add_service_port(AppIdDetector*, const ServiceDetectorPort&)