From: Tom Peters (thopeter) Date: Mon, 31 Oct 2022 17:49:04 +0000 (+0000) Subject: Pull request #3628: helpers: fix duplicate scratch_handler entry created by HyperScra... X-Git-Tag: 3.1.47.0~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cf49eb864d52355f8288c22f7561db5b5fdb8398;p=thirdparty%2Fsnort3.git Pull request #3628: helpers: fix duplicate scratch_handler entry created by HyperScratchAllocator Merge in SNORT/snort3 from ~BRASTULT/snort3:hyper_scratch_fix to master Squashed commit of the following: commit 00a3129e7c345dff322a8d0de6fa47499bf4f23c Author: Brandon Stultz 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 Date: Fri Oct 21 15:28:26 2022 -0400 helpers: fix duplicate scratch_handler --- diff --git a/src/helpers/hyper_scratch_allocator.cc b/src/helpers/hyper_scratch_allocator.cc index 19c94d709..8749c14f8 100644 --- a/src/helpers/hyper_scratch_allocator.cc +++ b/src/helpers/hyper_scratch_allocator.cc @@ -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; } diff --git a/src/helpers/hyper_scratch_allocator.h b/src/helpers/hyper_scratch_allocator.h index bd3227b46..5eec57efc 100644 --- a/src/helpers/hyper_scratch_allocator.h +++ b/src/helpers/hyper_scratch_allocator.h @@ -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; }; } diff --git a/src/helpers/scratch_allocator.h b/src/helpers/scratch_allocator.h index e92b8d286..8b08f5c52 100644 --- a/src/helpers/scratch_allocator.h +++ b/src/helpers/scratch_allocator.h @@ -55,7 +55,6 @@ public: protected: ScratchAllocator(); -private: int id; }; diff --git a/src/service_inspectors/http_inspect/http_param.h b/src/service_inspectors/http_inspect/http_param.h index 121a8d8b0..a69b5752b 100644 --- a/src/service_inspectors/http_inspect/http_param.h +++ b/src/service_inspectors/http_inspect/http_param.h @@ -29,8 +29,10 @@ 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 diff --git a/src/service_inspectors/http_inspect/ips_http_param.h b/src/service_inspectors/http_inspect/ips_http_param.h index c7ca347ac..baec16323 100644 --- a/src/service_inspectors/http_inspect/ips_http_param.h +++ b/src/service_inspectors/http_inspect/ips_http_param.h @@ -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" @@ -32,9 +33,15 @@ 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;