]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Merge pull request #1288 in SNORT/snort3 from offload_dce_ropts to master
authorMichael Altizer (mialtize) <mialtize@cisco.com>
Tue, 3 Jul 2018 20:49:06 +0000 (16:49 -0400)
committerMichael Altizer (mialtize) <mialtize@cisco.com>
Tue, 3 Jul 2018 20:49:06 +0000 (16:49 -0400)
Squashed commit of the following:

commit 83ca1ea08c2265f65995d547884c1e0501471357
Author: BT <bbantwal@cisco.com>
Date:   Tue Jun 26 00:36:28 2018 -0400

    detection: save the ropts used for dce rule options in ips context to support offload

18 files changed:
src/detection/context_switcher.cc
src/detection/detection_engine.cc
src/detection/detection_engine.h
src/detection/ips_context.cc
src/detection/ips_context.h
src/service_inspectors/dce_rpc/CMakeLists.txt
src/service_inspectors/dce_rpc/dce_common.cc
src/service_inspectors/dce_rpc/dce_common.h
src/service_inspectors/dce_rpc/dce_context_data.cc [new file with mode: 0644]
src/service_inspectors/dce_rpc/dce_context_data.h [new file with mode: 0644]
src/service_inspectors/dce_rpc/dce_smb.cc
src/service_inspectors/dce_rpc/dce_tcp.cc
src/service_inspectors/dce_rpc/dce_udp.cc
src/service_inspectors/dce_rpc/dce_udp_processing.cc
src/service_inspectors/dce_rpc/ips_dce_iface.cc
src/service_inspectors/dce_rpc/ips_dce_opnum.cc
src/service_inspectors/dce_rpc/ips_dce_stub_data.cc
src/service_inspectors/dce_rpc/smb_message.cc

index aa1b8e47c1c96c5213fb204d7a485c2f3175c352..60fc112f561c3ac4d23049d3f44ba8bc4df7f144 100644 (file)
@@ -125,7 +125,9 @@ IpsContext* ContextSwitcher::complete()
     assert(!busy.empty());
     trace_logf(detection, TRACE_DETECTION_ENGINE, "%" PRIu64 " cs::complete %u (i=%zu, b=%zu)\n",
         pc.total_from_daq, busy.back()->get_slot(), idle.size(), busy.size());
-    idle.push_back(busy.back());
+    IpsContext* c = busy.back();
+    c->clear_context_data();
+    idle.push_back(c);
     busy.pop_back();
     return busy.empty() ? nullptr : busy.back();
 }
index 0b4a6f1dc667b3f8e48c7bb889988d64f1c40940..599ab8a59100d25f3379147f10448e4fa04b9fd6 100644 (file)
@@ -164,6 +164,14 @@ void DetectionEngine::set_data(unsigned id, IpsContextData* p)
 IpsContextData* DetectionEngine::get_data(unsigned id)
 { return Snort::get_switcher()->get_context()->get_context_data(id); }
 
+IpsContextData* DetectionEngine::get_data(unsigned id, IpsContext* context)
+{
+    if ( context )
+        return context->get_context_data(id);
+
+    return DetectionEngine::get_data(id);
+}
+
 void DetectionEngine::add_replacement(const std::string& s, unsigned off)
 { 
     Replacement r;
index 444ee0fefdb494179ec731ac55cd3fd978f5a4a9..1ae253da358cdc7876b982490676de41ae72eb63 100644 (file)
@@ -75,6 +75,7 @@ public:
 
     static void set_data(unsigned id, IpsContextData*);
     static IpsContextData* get_data(unsigned id);
+    static IpsContextData* get_data(unsigned id, IpsContext* context);
 
     static void add_replacement(const std::string&, unsigned);
     static bool get_replacement(std::string&, unsigned&);
index c3f32661b301677ed0e85f283ea137d4949a91b9..96d25de484958d61318138553bc162b319e6288c 100644 (file)
@@ -79,7 +79,10 @@ IpsContext::~IpsContext()
     for ( auto* p : data )
     {
         if ( p )
+        {
+            p->clear();
             delete p;
+        }
     }
 
     sfeventq_free(equeue);
@@ -102,6 +105,15 @@ IpsContextData* IpsContext::get_context_data(unsigned id) const
     return data[id];
 }
 
+void IpsContext::clear_context_data()
+{
+    for ( auto* p : data )
+    {
+        if ( p )
+            p->clear();
+    }
+}
+
 //--------------------------------------------------------------------------
 // unit tests
 //--------------------------------------------------------------------------
index 99e0073055ca64c9468319d4fba61667bc06e92e..b0cf5d648c6e3b0734ae34a8714ef296294bf99c 100644 (file)
@@ -53,6 +53,7 @@ public:
 
     static unsigned get_ips_id();
     static unsigned get_max_id();
+    virtual void clear() {}
 
 protected:
     IpsContextData() = default;
@@ -69,6 +70,7 @@ public:
 
     void set_context_data(unsigned id, IpsContextData*);
     IpsContextData* get_context_data(unsigned id) const;
+    void clear_context_data();
 
     void set_slot(unsigned s)
     { slot = s; }
index 1b37db8ee10ffd066572b2f1ffcfd618cfd815bb..d9732393848fdaff2e7a972569bd569b95bb8912 100644 (file)
@@ -4,6 +4,8 @@ set( FILE_LIST
     dce_co.h 
     dce_common.cc 
     dce_common.h 
+    dce_context_data.cc 
+    dce_context_data.h
     dce_http_proxy.cc
     dce_http_proxy_module.cc 
     dce_http_proxy_module.h 
index df7ad902ee266fa1238cba7f133c73844c4e045c..6d6f8eb985743c2d6950405fbc56c382bcb2e9bd 100644 (file)
@@ -29,6 +29,7 @@
 #include "log/messages.h"
 #include "utils/safec.h"
 
+#include "dce_context_data.h"
 #include "dce_http_proxy_module.h"
 #include "dce_http_server_module.h"
 #include "dce_smb_utils.h"
@@ -168,6 +169,7 @@ static void dce2_protocol_detect(DCE2_SsnData* sd, snort::Packet* pkt)
 
 void DCE2_Detect(DCE2_SsnData* sd)
 {
+    DceContextData::set_current_ropts(sd);
     if ( using_rpkt )
     {
         using_rpkt = false;
@@ -178,33 +180,33 @@ void DCE2_Detect(DCE2_SsnData* sd)
     snort::Packet* top_pkt = DetectionEngine::get_current_packet();
     dce2_protocol_detect(sd, top_pkt);
     /* Always reset rule option data after detecting */
-    DCE2_ResetRopts(&sd->ropts);
+    DCE2_ResetRopts(sd , top_pkt);
 }
 
-DCE2_SsnData* get_dce2_session_data(snort::Packet* p)
+DCE2_TransType get_dce2_trans_type(const snort::Packet* p)
 {
     DCE2_SmbSsnData* smb_data = get_dce2_smb_session_data(p->flow);
     DCE2_SsnData* sd = (smb_data != nullptr) ? &(smb_data->sd) : nullptr;
     if ((sd != nullptr) && (sd->trans == DCE2_TRANS_TYPE__SMB))
     {
-        return sd;
+        return DCE2_TRANS_TYPE__SMB;
     }
 
     DCE2_TcpSsnData* tcp_data = get_dce2_tcp_session_data(p->flow);
     sd = (tcp_data != nullptr) ? &(tcp_data->sd) : nullptr;
     if ((sd != nullptr) && (sd->trans == DCE2_TRANS_TYPE__TCP))
     {
-        return sd;
+        return DCE2_TRANS_TYPE__TCP;
     }
 
     DCE2_UdpSsnData* udp_data = get_dce2_udp_session_data(p->flow);
     sd = (udp_data != nullptr) ? &(udp_data->sd) : nullptr;
     if ((sd != nullptr) && (sd->trans == DCE2_TRANS_TYPE__UDP))
     {
-        return sd;
+        return DCE2_TRANS_TYPE__UDP;
     }
 
-    return nullptr;
+    return DCE2_TRANS_TYPE__NONE;
 }
 
 DceEndianness::DceEndianness()
index 8cb5454e5bb9fd7425ea76eea888ffce4eed9dc5..10d414cb84331746953e33f3d983731b538ccbce 100644 (file)
@@ -30,6 +30,7 @@
 #include "protocols/packet.h"
 
 #include "dce_list.h"
+#include "dce_context_data.h"
 
 extern const snort::InspectApi dce2_smb_api;
 extern const snort::InspectApi dce2_tcp_api;
@@ -223,11 +224,12 @@ public:
     void reset();
 };
 
-inline void DCE2_ResetRopts(DCE2_Roptions* ropts)
+inline void DCE2_ResetRopts(DCE2_SsnData* sd, snort::Packet* p)
 {
-    ropts->first_frag = DCE2_SENTINEL;
-    ropts->opnum = DCE2_SENTINEL;
-    ropts->stub_data = nullptr;
+    sd->ropts.first_frag = DCE2_SENTINEL;
+    sd->ropts.opnum = DCE2_SENTINEL;
+    sd->ropts.stub_data = nullptr;
+    DceContextData::clear_current_ropts(p, sd->trans);
 }
 
 inline void DCE2_SsnSetNoInspect(DCE2_SsnData* sd)
@@ -405,7 +407,7 @@ void DCE2_Detect(DCE2_SsnData*);
 snort::Packet* DCE2_GetRpkt(snort::Packet*, DCE2_RpktType, const uint8_t*, uint32_t);
 uint16_t DCE2_GetRpktMaxData(DCE2_SsnData*, DCE2_RpktType);
 DCE2_Ret DCE2_AddDataToRpkt(snort::Packet*, const uint8_t*, uint32_t);
-DCE2_SsnData* get_dce2_session_data(snort::Packet*);
+DCE2_TransType get_dce2_trans_type(const snort::Packet* p);
 
 #endif
 
diff --git a/src/service_inspectors/dce_rpc/dce_context_data.cc b/src/service_inspectors/dce_rpc/dce_context_data.cc
new file mode 100644 (file)
index 0000000..8220633
--- /dev/null
@@ -0,0 +1,166 @@
+//--------------------------------------------------------------------------
+// Copyright (C) 2018-2018 Cisco and/or its affiliates. All rights reserved.
+//
+// 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.
+//--------------------------------------------------------------------------
+// dce_context_data.cc author Bhagya Tholpady <bbantwal@cisco.com>
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "dce_context_data.h"
+
+#include "protocols/packet.h"
+
+#include "dce_utils.h"
+#include "dce_common.h"
+
+using namespace snort;
+
+unsigned DceContextData::smb_ips_id = 0;
+unsigned DceContextData::tcp_ips_id = 0;
+unsigned DceContextData::udp_ips_id = 0;
+
+void DceContextData::init(DCE2_TransType trans)
+{
+    set_ips_id(trans, IpsContextData::get_ips_id());
+}
+
+unsigned DceContextData::get_ips_id(DCE2_TransType trans)
+{
+    switch(trans)
+    {
+        case DCE2_TRANS_TYPE__SMB: 
+            return DceContextData::smb_ips_id;
+        case DCE2_TRANS_TYPE__TCP:
+            return DceContextData::tcp_ips_id;
+        case DCE2_TRANS_TYPE__UDP:
+            return DceContextData::udp_ips_id;
+        default:
+            break;
+    }
+    return 0;
+}
+
+void DceContextData::set_ips_id(DCE2_TransType trans, unsigned id)
+{
+    switch(trans)
+    {
+        case DCE2_TRANS_TYPE__SMB: 
+            DceContextData::smb_ips_id = id;
+            break;
+        case DCE2_TRANS_TYPE__TCP:
+            DceContextData::tcp_ips_id = id;
+            break;
+        case DCE2_TRANS_TYPE__UDP:
+            DceContextData::udp_ips_id = id;
+            break;
+        default:
+            break;
+    }
+    return;
+}
+
+DceContextData* DceContextData::get_current_data(const Packet* p)
+{
+    IpsContext* context = p ? p->context : nullptr;
+    unsigned ips_id = get_ips_id(get_dce2_trans_type(p));
+
+    if ( !ips_id )
+        return nullptr;
+
+    DceContextData* dcd = (DceContextData*)DetectionEngine::get_data(ips_id, context);
+
+    if ( !dcd )
+        return nullptr;
+
+    return dcd;
+}
+
+bool DceContextData::is_noinspect(const Packet* p)
+{
+    DceContextData* dcd = get_current_data(p);
+
+    if ( !dcd )
+        return true;
+
+    return dcd->no_inspect;
+}
+
+DCE2_Roptions* DceContextData::get_current_ropts(const Packet* p)
+{
+    DceContextData* dcd = get_current_data(p);
+
+    if ( !dcd )
+        return nullptr;
+
+    return dcd->current_ropts;
+}
+
+void DceContextData::set_current_ropts(DCE2_SsnData* sd)
+{
+    unsigned ips_id = get_ips_id(sd->trans);
+
+    if ( !ips_id )
+        return;
+
+    DceContextData* dcd = (DceContextData*)DetectionEngine::get_data(ips_id);
+
+    if ( !dcd )
+    {
+        dcd = new DceContextData;
+        DetectionEngine::set_data(ips_id, dcd);
+    }
+
+    if ( !dcd->current_ropts )
+    {
+        dcd->current_ropts = new DCE2_Roptions;
+    }
+
+    *(dcd->current_ropts) = sd->ropts;
+    dcd->no_inspect = DCE2_SsnNoInspect(sd);
+}
+
+void DceContextData::clear_current_ropts(IpsContext* context, DCE2_TransType trans)
+{
+    unsigned ips_id = get_ips_id(trans);
+
+    if ( !ips_id )
+        return;
+
+    DceContextData* dcd = (DceContextData*)DetectionEngine::get_data(ips_id, context);
+
+    if ( dcd )
+    {
+        dcd->clear();
+    }
+
+    return;
+}
+void DceContextData::clear_current_ropts(const Packet* p, DCE2_TransType trans)
+{
+    IpsContext* context = p ? p->context : nullptr;
+    clear_current_ropts(context, trans);
+}
+
+void DceContextData::clear()
+{
+    if ( current_ropts )
+        delete current_ropts;
+    current_ropts = nullptr;
+    no_inspect = false;
+}
+
diff --git a/src/service_inspectors/dce_rpc/dce_context_data.h b/src/service_inspectors/dce_rpc/dce_context_data.h
new file mode 100644 (file)
index 0000000..8b0ed07
--- /dev/null
@@ -0,0 +1,54 @@
+//--------------------------------------------------------------------------
+// Copyright (C) 2018-2018 Cisco and/or its affiliates. All rights reserved.
+//
+// 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.
+//--------------------------------------------------------------------------
+// dce_context_data.h author Bhagya Tholpady <bbantwal@cisco.com>
+
+#ifndef DCE_CONTEXT_DATA_H
+#define DCE_CONTEXT_DATA_H
+
+#include "detection/ips_context.h"
+#include "dce_utils.h"
+
+struct DCE2_Roptions;
+struct DCE2_SsnData;
+
+class DceContextData : public snort::IpsContextData
+{
+public:
+    void clear() override;
+
+    static unsigned smb_ips_id;
+    static unsigned tcp_ips_id;
+    static unsigned udp_ips_id;
+
+    DCE2_Roptions* current_ropts = nullptr;
+    bool no_inspect = false;
+
+    static void init(DCE2_TransType trans);
+    static unsigned get_ips_id(DCE2_TransType trans);
+    static void set_ips_id(DCE2_TransType trans, unsigned id);
+
+    static DceContextData* get_current_data(const snort::Packet* p);
+    static DCE2_Roptions* get_current_ropts(const snort::Packet* p);
+    static bool is_noinspect(const snort::Packet* p);
+    static void set_current_ropts(DCE2_SsnData* sd);
+    static void clear_current_ropts(const snort::Packet* p, DCE2_TransType trans);
+    static void clear_current_ropts(snort::IpsContext* context, DCE2_TransType trans);
+};
+
+#endif
+
index cd8ae025bd19a3eeb0c436d7c3288a2a84d25774..b30e44a9a413e17e008eb0c1ecaa854749c534dc 100644 (file)
@@ -30,6 +30,7 @@
 #include "utils/util.h"
 #include "packet_io/active.h"
 
+#include "dce_context_data.h"
 #include "dce_smb_commands.h"
 #include "dce_smb_module.h"
 #include "dce_smb_paf.h"
@@ -343,6 +344,7 @@ public:
 
     void show(snort::SnortConfig*) override;
     void eval(snort::Packet*) override;
+    void clear(snort::Packet*) override;
     snort::StreamSplitter* get_splitter(bool c2s) override
     {
         return new Dce2SmbSplitter(c2s);
@@ -400,13 +402,20 @@ void Dce2Smb::eval(snort::Packet* p)
         if (!dce2_detected)
             DCE2_Detect(&dce2_smb_sess->sd);
 
-        DCE2_ResetRopts(&dce2_smb_sess->sd.ropts);
-
         delete p->endianness;
         p->endianness = nullptr;
     }
 }
 
+void Dce2Smb::clear(snort::Packet* p)
+{
+    DCE2_SmbSsnData* dce2_smb_sess = get_dce2_smb_session_data(p->flow);
+    if ( dce2_smb_sess )
+    {
+        DCE2_ResetRopts(&dce2_smb_sess->sd, p);
+    }
+}
+
 //-------------------------------------------------------------------------
 // api stuff
 //-------------------------------------------------------------------------
@@ -426,6 +435,7 @@ static void dce2_smb_init()
     Dce2SmbFlowData::init();
     DCE2_SmbInitGlobals();
     DCE2_SmbInitDeletePdu();
+    DceContextData::init(DCE2_TRANS_TYPE__SMB);
 }
 
 static snort::Inspector* dce2_smb_ctor(snort::Module* m)
index bdf0302372915400f8dc0b3237cf744076749f84..a88eb6aa830fdb4af28e12ecfb1e77a628617ca2 100644 (file)
@@ -28,6 +28,7 @@
 #include "detection/detection_engine.h"
 #include "utils/util.h"
 
+#include "dce_context_data.h"
 #include "dce_common.h"
 #include "dce_tcp_module.h"
 #include "dce_tcp_paf.h"
@@ -86,7 +87,7 @@ static DCE2_TcpSsnData* dce2_create_new_tcp_session(Packet* p, dce2TcpProtoConf*
     if ( dce2_tcp_sess )
     {
         DCE2_CoInitTracker(&dce2_tcp_sess->co_tracker);
-        DCE2_ResetRopts(&dce2_tcp_sess->sd.ropts);
+        DCE2_ResetRopts(&dce2_tcp_sess->sd, p);
 
         dce2_tcp_stats.tcp_sessions++;
 
@@ -125,6 +126,7 @@ public:
 
     void show(SnortConfig*) override;
     void eval(Packet*) override;
+    void clear(Packet*) override;
     StreamSplitter* get_splitter(bool c2s) override
     {
         return new Dce2TcpSplitter(c2s);
@@ -170,13 +172,21 @@ void Dce2Tcp::eval(Packet* p)
         if (!dce2_detected)
             DCE2_Detect(&dce2_tcp_sess->sd);
 
-        DCE2_ResetRopts(&dce2_tcp_sess->sd.ropts);
-
         delete p->endianness;
         p->endianness = nullptr;
     }
 }
 
+void Dce2Tcp::clear(Packet* p)
+{
+    DCE2_TcpSsnData* dce2_tcp_sess = get_dce2_tcp_session_data(p->flow);
+    if ( dce2_tcp_sess )
+    {
+        DCE2_ResetRopts(&dce2_tcp_sess->sd, p);
+    }
+
+}
+
 //-------------------------------------------------------------------------
 // api stuff
 //-------------------------------------------------------------------------
@@ -207,6 +217,7 @@ static void dce2_tcp_dtor(Inspector* p)
 static void dce2_tcp_init()
 {
     Dce2TcpFlowData::init();
+    DceContextData::init(DCE2_TRANS_TYPE__TCP);
 }
 
 const InspectApi dce2_tcp_api =
index c1efa946ae2cf37209b2a3d41855392961668437..f7991b326933987b053a8a16a40e3caf45d1c9c6 100644 (file)
@@ -28,6 +28,7 @@
 #include "detection/detection_engine.h"
 #include "utils/util.h"
 
+#include "dce_context_data.h"
 #include "dce_udp_module.h"
 
 using namespace snort;
@@ -94,7 +95,7 @@ static DCE2_UdpSsnData* dce2_create_new_udp_session(Packet* p, dce2UdpProtoConf*
 
     DCE2_UdpSsnData* dce2_udp_sess = set_new_dce2_udp_session(p);
 
-    DCE2_ResetRopts(&dce2_udp_sess->sd.ropts);
+    DCE2_ResetRopts(&dce2_udp_sess->sd, p);
 
     dce2_udp_stats.udp_sessions++;
     dce2_udp_sess->sd.trans = DCE2_TRANS_TYPE__UDP;
@@ -124,6 +125,7 @@ public:
     Dce2Udp(dce2UdpProtoConf&);
     void show(SnortConfig*) override;
     void eval(Packet*) override;
+    void clear(Packet*) override;
 
 private:
     dce2UdpProtoConf config;
@@ -161,13 +163,21 @@ void Dce2Udp::eval(Packet* p)
         if (!dce2_detected)
             DCE2_Detect(&dce2_udp_sess->sd);
 
-        DCE2_ResetRopts(&dce2_udp_sess->sd.ropts);
-
         delete p->endianness;
         p->endianness = nullptr;
     }
 }
 
+void Dce2Udp::clear(Packet* p)
+{
+    DCE2_UdpSsnData* dce2_udp_sess = get_dce2_udp_session_data(p->flow);
+    if ( dce2_udp_sess )
+    {
+        DCE2_ResetRopts(&dce2_udp_sess->sd, p);
+    }
+
+}
+
 //-------------------------------------------------------------------------
 // api stuff
 //-------------------------------------------------------------------------
@@ -198,6 +208,7 @@ static void dce2_udp_dtor(Inspector* p)
 static void dce2_udp_init()
 {
     Dce2UdpFlowData::init();
+    DceContextData::init(DCE2_TRANS_TYPE__UDP);
 }
 
 const InspectApi dce2_udp_api =
index 1c1233fa5c3568637624be6819ca8981fd6a3c64..5bc75aa1fdd36911f9e5428b7defb98c5afac0ca 100644 (file)
@@ -310,7 +310,7 @@ static void DCE2_ClRequest(DCE2_SsnData* sd, DCE2_ClActTracker* at, const DceRpc
         return;
     }
 
-    DCE2_ResetRopts(&sd->ropts);
+    DCE2_ResetRopts(sd, nullptr);
 
     if (!DceRpcClFrag(cl_hdr))  /* It's a full request */
     {
index 7e49647869780061c6fc3203f1dbe852c802a108..79be4ffc06ced09d0670ee199efe7c322dea9e82 100644 (file)
@@ -373,14 +373,15 @@ IpsOption::EvalStatus Dce2IfaceOption::eval(Cursor&, Packet* p)
         return NO_MATCH;
     }
 
-    DCE2_SsnData* sd= get_dce2_session_data(p);
-
-    if ((sd == nullptr) || DCE2_SsnNoInspect(sd))
+    if (DceContextData::is_noinspect(p))
     {
         return NO_MATCH;
     }
 
-    DCE2_Roptions* ropts = &sd->ropts;
+    DCE2_Roptions* ropts = DceContextData::get_current_ropts(p);
+
+    if ( !ropts )
+        return NO_MATCH;
 
     if (ropts->first_frag == DCE2_SENTINEL)
     {
index 1967a0613cc3eb2f7b52d95a8ab298e41584ca08..395645d9b27a90c33e67a87c26be859875f2fd2e 100644 (file)
@@ -407,14 +407,15 @@ IpsOption::EvalStatus Dce2OpnumOption::eval(Cursor&, Packet* p)
         return NO_MATCH;
     }
 
-    DCE2_SsnData* sd = get_dce2_session_data(p);
-
-    if ((sd == nullptr) || DCE2_SsnNoInspect(sd))
+    if (DceContextData::is_noinspect(p))
     {
         return NO_MATCH;
     }
 
-    DCE2_Roptions* ropts = &sd->ropts;
+    DCE2_Roptions* ropts = DceContextData::get_current_ropts(p);
+
+    if ( !ropts )
+        return NO_MATCH;
 
     if (ropts->opnum == DCE2_SENTINEL)
     {
index 4bd56a5908ebd3418aee8c78db4790ea08ff8875..f7be0aee16d43b7065a7e3543732e17c747aa49d 100644 (file)
@@ -78,14 +78,15 @@ IpsOption::EvalStatus Dce2StubDataOption::eval(Cursor& c, Packet* p)
         return NO_MATCH;
     }
 
-    DCE2_SsnData* sd = get_dce2_session_data(p);
-
-    if ((sd == nullptr) || DCE2_SsnNoInspect(sd))
+    if (DceContextData::is_noinspect(p))
     {
         return NO_MATCH;
     }
 
-    DCE2_Roptions* ropts = &sd->ropts;
+    DCE2_Roptions* ropts = DceContextData::get_current_ropts(p);
+
+    if ( !ropts )
+        return NO_MATCH;
 
     if (ropts->stub_data != nullptr)
     {
index f0810be768eece43db6d8d8c9134011656b9a71b..c089cdf8c27bd71dac8b364eba6b22f333b07ef5 100644 (file)
@@ -1330,7 +1330,7 @@ static DCE2_SmbSsnData* dce2_create_new_smb_session(Packet* p, dce2SmbProtoConf*
         dce2_smb_sess->rtracker.mid = DCE2_SENTINEL;
         dce2_smb_sess->max_file_depth = snort::FileService::get_max_file_depth();
 
-        DCE2_ResetRopts(&dce2_smb_sess->sd.ropts);
+        DCE2_ResetRopts(&dce2_smb_sess->sd, p);
 
         dce2_smb_stats.smb_sessions++;