]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Pull request #3628: helpers: fix duplicate scratch_handler entry created by HyperScra...
authorTom Peters (thopeter) <thopeter@cisco.com>
Mon, 31 Oct 2022 17:49:04 +0000 (17:49 +0000)
committerTom Peters (thopeter) <thopeter@cisco.com>
Mon, 31 Oct 2022 17:49:04 +0000 (17:49 +0000)
Merge in SNORT/snort3 from ~BRASTULT/snort3:hyper_scratch_fix to master

Squashed commit of the following:

commit 00a3129e7c345dff322a8d0de6fa47499bf4f23c
Author: Brandon Stultz <brastult@cisco.com>
Date:   Fri Oct 21 15:30:36 2022 -0400

    http_inspect: move LiteralSearch::setup for http_param to its module

commit 942fa0ca625efe7b62338cd3a927628390e3dcc6
Author: Brandon Stultz <brastult@cisco.com>
Date:   Fri Oct 21 15:28:26 2022 -0400

    helpers: fix duplicate scratch_handler

src/helpers/hyper_scratch_allocator.cc
src/helpers/hyper_scratch_allocator.h
src/helpers/scratch_allocator.h
src/service_inspectors/http_inspect/http_param.h
src/service_inspectors/http_inspect/ips_http_param.h

index 19c94d70990305f48bccadc44e6bb2e8b7e015c3..8749c14f88516595c2076818db95ceadb7b48a8e 100644 (file)
@@ -35,9 +35,6 @@ HyperScratchAllocator::~HyperScratchAllocator()
 
 bool HyperScratchAllocator::allocate(hs_database_t* db)
 {
-    if ( scratch_id < 0 )
-        scratch_id = SnortConfig::request_scratch(this);
-
     return hs_alloc_scratch(db, &scratch) == HS_SUCCESS;
 }
 
index bd3227b46b5c81d105f17e8c07f4c57bb1ac8a7b..5eec57efca7ca0b4e1454dcdffa7039da39ff097 100644 (file)
@@ -53,17 +53,16 @@ public:
 
 private:
     hs_scratch_t** get_addr(SnortConfig* sc, unsigned idx)
-    { return (hs_scratch_t**)&sc->state[idx][scratch_id]; }
+    { return (hs_scratch_t**)&sc->state[idx][id]; }
 
     hs_scratch_t* get(const SnortConfig* sc, unsigned idx)
-    { return (hs_scratch_t*)sc->state[idx][scratch_id]; }
+    { return (hs_scratch_t*)sc->state[idx][id]; }
 
     void set(SnortConfig* sc, unsigned idx, void* pv)
-    { sc->state[idx][scratch_id] = pv; }
+    { sc->state[idx][id] = pv; }
 
 private:
     hs_scratch_t* scratch = nullptr;
-    int scratch_id = -1;
 };
 
 }
index e92b8d286109fe5f2365ca33819fe64dc78d171c..8b08f5c52e174ac694b815ab40f546382ae65934 100644 (file)
@@ -55,7 +55,6 @@ public:
 protected:
     ScratchAllocator();
 
-private:
     int id;
 };
 
index 121a8d8b06e019e851b4f7f86fc41971b34b6edc..a69b5752b63a1595a271a813acc8bcc65e2517a8 100644 (file)
 class HttpParam
 {
 public:
-    HttpParam(const std::string& param_, bool nocase_)
-        : param(param_), param_upper(param_), nocase(nocase_)
+    HttpParam(const std::string& param_, bool nocase_,
+        snort::LiteralSearch::Handle* search_handle_)
+        : param(param_), param_upper(param_), nocase(nocase_),
+          search_handle(search_handle_)
     {
         assert(param.length() > 0);
 
@@ -40,8 +42,6 @@ public:
         const uint8_t* pattern = (const uint8_t*)param_upper.c_str();
         unsigned pattern_length = param_upper.length();
 
-        search_handle = snort::LiteralSearch::setup();
-
         searcher = snort::LiteralSearch::instantiate(
             search_handle, pattern, pattern_length, true
         );
@@ -50,7 +50,6 @@ public:
     ~HttpParam()
     {
         delete searcher;
-        snort::LiteralSearch::cleanup(search_handle);
     }
 
     bool operator==(const HttpParam& rhs) const
index c7ca347acdc14e042a9ba9eec1a98518cc0f94ab..baec16323f57bb51a2ac8af6f301281ed151f07c 100644 (file)
@@ -24,6 +24,7 @@
 #include "profiler/profiler.h"
 #include "framework/ips_option.h"
 #include "framework/module.h"
+#include "helpers/literal_search.h"
 
 #include "http_param.h"
 #include "ips_http.h"
 class HttpParamRuleOptModule : public HttpRuleOptModule
 {
 public:
-    HttpParamRuleOptModule(const char* key_, const char* help, HttpEnums::HTTP_RULE_OPT rule_opt_index_,
+    HttpParamRuleOptModule(const char* key_, const char* help,
+        HttpEnums::HTTP_RULE_OPT rule_opt_index_,
         snort::CursorActionType cat_, const snort::Parameter params[])
-        : HttpRuleOptModule(key_, help, rule_opt_index_, cat_, params) {}
+        : HttpRuleOptModule(key_, help, rule_opt_index_, cat_, params)
+    { search_handle = snort::LiteralSearch::setup(); }
+
+    ~HttpParamRuleOptModule()
+    { snort::LiteralSearch::cleanup(search_handle); }
+
     snort::ProfileStats* get_profile() const override { return &http_param_ps; }
     static void mod_dtor(snort::Module* m) { delete m; }
     bool begin(const char*, int, snort::SnortConfig*) override;
@@ -45,16 +52,17 @@ private:
     friend class HttpParamIpsOption;
     static THREAD_LOCAL snort::ProfileStats http_param_ps;
   
-    std::string param;        // provide buffer containing specific parameter
+    std::string param;       // provide buffer containing specific parameter
     bool nocase;             // case insensitive match
+    snort::LiteralSearch::Handle* search_handle;
 };
 
 class HttpParamIpsOption : public HttpIpsOption
 {
 public:
-    HttpParamIpsOption(const HttpParamRuleOptModule* cm) :
-        HttpIpsOption(cm),
-        key(cm->key), http_param(cm->param, cm->nocase) {}
+    HttpParamIpsOption(const HttpParamRuleOptModule* cm)
+        : HttpIpsOption(cm), key(cm->key),
+          http_param(cm->param, cm->nocase, cm->search_handle) {}
     EvalStatus eval(Cursor&, snort::Packet*) override;
     uint32_t hash() const override;
     bool operator==(const snort::IpsOption& ips) const override;