From: Steve Chew (stechew) Date: Tue, 24 Sep 2019 18:01:41 +0000 (-0400) Subject: Merge pull request #1753 in SNORT/snort3 from ~BBANTWAL/snort3:snort2lua_base64_data_... X-Git-Tag: 3.0.0-262~25 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=177de3195f8b51bc428f1642d1ed3dc0b9200704;p=thirdparty%2Fsnort3.git Merge pull request #1753 in SNORT/snort3 from ~BBANTWAL/snort3:snort2lua_base64_data_fix to master Squashed commit of the following: commit 231cbf77f0673e00669d6d57410478d6ae1b8955 Author: Bhagya Tholpady Date: Thu Sep 19 13:06:10 2019 -0400 snort2lua: reset the sticky buffer name while converting unchanged sticky rule options and file_data --- diff --git a/tools/snort2lua/data/data_types/dt_rule.cc b/tools/snort2lua/data/data_types/dt_rule.cc index b18790727..75b995a35 100644 --- a/tools/snort2lua/data/data_types/dt_rule.cc +++ b/tools/snort2lua/data/data_types/dt_rule.cc @@ -114,6 +114,11 @@ void Rule::add_suboption(const std::string& keyword) void Rule::add_suboption(const std::string& keyword, const std::string& val) { options.back()->add_suboption(keyword, val); } +void Rule::reset_sticky() +{ + sticky_buffer.clear(); +} + void Rule::set_curr_options_buffer(const std::string& new_buffer, bool add_option) { /* set the buffer if diff --git a/tools/snort2lua/data/data_types/dt_rule.h b/tools/snort2lua/data/data_types/dt_rule.h index fa2cf8f01..b0a592193 100644 --- a/tools/snort2lua/data/data_types/dt_rule.h +++ b/tools/snort2lua/data/data_types/dt_rule.h @@ -40,6 +40,7 @@ public: void update_option(const std::string& keyword, const std::string& val); void add_suboption(const std::string& keyword); void add_suboption(const std::string& keyword, const std::string& val); + void reset_sticky(void); void set_curr_options_buffer(const std::string& buffer, bool add_option); void update_rule_action(const std::string&); void set_rule_old_action(const std::string&); diff --git a/tools/snort2lua/data/dt_rule_api.cc b/tools/snort2lua/data/dt_rule_api.cc index 807c892ec..c7e1834e4 100644 --- a/tools/snort2lua/data/dt_rule_api.cc +++ b/tools/snort2lua/data/dt_rule_api.cc @@ -232,6 +232,14 @@ void RuleApi::add_suboption(const std::string& keyword, DataApi::developer_error("Add some header data before adding content!!"); } +void RuleApi::reset_sticky(void) +{ + if (curr_rule) + curr_rule->reset_sticky(); + else + DataApi::developer_error("Add a rule before resetting the sticky buffer!!"); +} + void RuleApi::set_curr_options_buffer(const std::string& buffer, bool add_option) { if (curr_rule) diff --git a/tools/snort2lua/data/dt_rule_api.h b/tools/snort2lua/data/dt_rule_api.h index 5c6747d8d..a9d27ac7a 100644 --- a/tools/snort2lua/data/dt_rule_api.h +++ b/tools/snort2lua/data/dt_rule_api.h @@ -71,6 +71,7 @@ public: void update_option(const std::string& keyword, const std::string& val); void add_suboption(const std::string& keyword); void add_suboption(const std::string& keyword, const std::string& val); + void reset_sticky(void); void set_curr_options_buffer(const std::string& buffer, bool add_option=false); void set_rule_old_action(const std::string&); std::string& get_rule_old_action(); diff --git a/tools/snort2lua/rule_states/rule_file_data.cc b/tools/snort2lua/rule_states/rule_file_data.cc index d10a6297e..faf7c52da 100644 --- a/tools/snort2lua/rule_states/rule_file_data.cc +++ b/tools/snort2lua/rule_states/rule_file_data.cc @@ -44,6 +44,7 @@ bool FileData::convert(std::istringstream& data_stream) std::streamoff pos = data_stream.tellg(); rule_api.add_option("file_data"); + rule_api.reset_sticky(); args = util::get_rule_option_args(data_stream); // if there are no arguments, the option had a colon before a semicolon. diff --git a/tools/snort2lua/rule_states/rule_unchanged.cc b/tools/snort2lua/rule_states/rule_unchanged.cc index b16eba3ac..26bb88eb6 100644 --- a/tools/snort2lua/rule_states/rule_unchanged.cc +++ b/tools/snort2lua/rule_states/rule_unchanged.cc @@ -34,7 +34,7 @@ namespace rules * Examples are below the line marked 'FINISHED TEMPLATES'. */ -template +template class UnchangedRuleOption : public ConversionState { public: @@ -52,14 +52,17 @@ public: rule_api.add_option(*rule_name); } + if (sticky) + rule_api.reset_sticky(); + return set_next_rule_state(stream); } }; -template +template static ConversionState* unchanged_rule_ctor(Converter& c) { - return new UnchangedRuleOption(c); + return new UnchangedRuleOption(c); } /**************************************** @@ -438,7 +441,7 @@ static const std::string gtp_info = "gtp_info"; static const ConvertMap rule_gtp_info = { gtp_info, - unchanged_rule_ctor<& gtp_info>, + unchanged_rule_ctor<& gtp_info, true, true>, }; const ConvertMap* gtp_info_map = &rule_gtp_info; @@ -477,7 +480,7 @@ static const std::string modbus_data = "modbus_data"; static const ConvertMap rule_modbus_data = { modbus_data, - unchanged_rule_ctor<& modbus_data, false>, + unchanged_rule_ctor<& modbus_data, false, true>, }; const ConvertMap* modbus_data_map = &rule_modbus_data; @@ -516,7 +519,7 @@ static const std::string pkt_data = "pkt_data"; static const ConvertMap rule_pkt_data = { pkt_data, - unchanged_rule_ctor<& pkt_data, false>, + unchanged_rule_ctor<& pkt_data, false, true>, }; const ConvertMap* pkt_data_map = &rule_pkt_data; @@ -542,7 +545,7 @@ static const std::string base64_data = "base64_data"; static const ConvertMap rule_base64_data = { base64_data, - unchanged_rule_ctor<& base64_data, false>, + unchanged_rule_ctor<& base64_data, false, true>, }; const ConvertMap* base64_data_map = &rule_base64_data; @@ -594,7 +597,7 @@ static const std::string sip_body = "sip_body"; static const ConvertMap rule_sip_body = { sip_body, - unchanged_rule_ctor<& sip_body, false>, + unchanged_rule_ctor<& sip_body, false, true>, }; const ConvertMap* sip_body_map = &rule_sip_body; @@ -607,7 +610,7 @@ static const std::string sip_header = "sip_header"; static const ConvertMap rule_sip_header = { sip_header, - unchanged_rule_ctor<& sip_header, false>, + unchanged_rule_ctor<& sip_header, false, true>, }; const ConvertMap* sip_header_map = &rule_sip_header; @@ -659,7 +662,7 @@ static const std::string dnp3_data = "dnp3_data"; static const ConvertMap rule_dnp3_data = { dnp3_data, - unchanged_rule_ctor<& dnp3_data, false>, + unchanged_rule_ctor<& dnp3_data, false, true>, }; const ConvertMap* dnp3_data_map = &rule_dnp3_data; @@ -685,7 +688,7 @@ static const std::string dce_stub_data = "dce_stub_data"; static const ConvertMap rule_dce_stub_data = { dce_stub_data, - unchanged_rule_ctor<& dce_stub_data, false>, + unchanged_rule_ctor<& dce_stub_data, false, true>, }; const ConvertMap* dce_stub_data_map = &rule_dce_stub_data;