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;
};
}
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);
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
);
~HttpParam()
{
delete searcher;
- snort::LiteralSearch::cleanup(search_handle);
}
bool operator==(const HttpParam& rhs) const
#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;
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;