void Rule::set_curr_options_buffer(const std::string& new_buffer, bool add_option)
{
- if (new_buffer == "pkt_data")
+ /* set the buffer if
+ * 1) No buffer has been set and this is not the default "pkt_data" buffer
+ * 2) The sticky buffer is set and is not equal to the new buffer
+ */
+ if ( (sticky_buffer.empty() && new_buffer != "pkt_data") ||
+ (!sticky_buffer.empty() && sticky_buffer != new_buffer) )
{
- if (sticky_buffer.empty())
- {
- sticky_buffer = "pkt_data";
- return;
- }
-
- if (sticky_buffer == "pkt_data")
- {
- return;
- }
+ RuleOption* new_opt = new RuleOption(new_buffer);
+ if ( add_option )
+ options.push_back(new_opt);
+ else
+ options.insert(options.end() - 1, new_opt);
+ sticky_buffer = new_buffer;
}
-
- RuleOption* new_opt = new RuleOption(new_buffer);
- if ( add_option )
- options.push_back(new_opt);
- else
- options.insert(options.end() - 1, new_opt);
-
- sticky_buffer = new_buffer;
}
std::ostream& operator<<(std::ostream& out, const Rule& rule)
const bool no_service_http = (service.find("http") == std::string::npos);
std::string new_buffer;
std::vector<RuleOption*>::iterator iter = options.begin();
- std::vector<RuleOption*>::iterator next_opt_iter;
while (iter != options.end())
{
std::string name = (*iter)->get_name();
if (name == "pcre_P_option_body" ||
- name == "pcre_P_option_body_rel" ||
- name == "pcre_H_option_header" ||
- name == "pcre_H_option_header_rel")
+ name == "pcre_H_option_header")
{
delete(*iter);
iter = options.erase(iter);
if (service_sip)
{
- if (name == "pcre_P_option_body" ||
- name == "pcre_P_option_body_rel")
+ if (name == "pcre_P_option_body")
{
new_buffer = "sip_body";
}
}
else
{
- if (name == "pcre_P_option_body" ||
- name == "pcre_P_option_body_rel")
+ if (name == "pcre_P_option_body")
{
if (no_service_http)
{
}
}
- /* Add sticky buffer option if not equal to current,
- * or if the pcre option is not relative */
- if (curr_sticky_buffer != new_buffer ||
- (name != "pcre_P_option_body_rel" &&
- name != "pcre_H_option_header_rel"))
+ /* Add sticky buffer option if not equal to current */
+ if (curr_sticky_buffer != new_buffer)
{
curr_sticky_buffer = new_buffer;
RuleOption* new_opt = new RuleOption(new_buffer);
name == "dce_stub_data" ||
name == "dnp3_data" ||
name == "modbus_data" ||
- name == "sip_header" ||
- name == "sip_body")
- {
- curr_sticky_buffer = name;
- ++iter;
- }
- else if (name == "http_header" ||
- name == "http_client_body" ||
name == "http_cookie" ||
name == "http_method" ||
name == "http_raw_cookie" ||
name == "http_stat_msg" ||
name == "http_uri" ||
name == "raw_data")
+ {
+ curr_sticky_buffer = name;
+ ++iter;
+ }
+ else if (name == "http_header" ||
+ name == "http_client_body" ||
+ name == "sip_header" ||
+ name == "sip_body")
{
if (curr_sticky_buffer == name)
{
- next_opt_iter = std::next(iter, 1);
- if (next_opt_iter != options.end())
- {
- if ((*next_opt_iter)->is_relative_content())
- {
- delete(*iter);
- iter = options.erase(iter);
- }
- else
- {
- ++iter;
- }
- }
- else
- {
- ++iter;
- }
+ delete(*iter);
+ iter = options.erase(iter);
}
else
{
pattern += pcre_str.substr(0, pattern_end + 1);
options = pcre_str.substr(pattern_end + 1, std::string::npos);
new_opts = "";
- bool relative = false;
for (char c : options )
{
case 'E':
case 'G':
case 'O':
- case '"': // end of reg_ex
- new_opts += c;
- break;
case 'R':
- relative = true;
+ case '"': // end of reg_ex
new_opts += c;
break;
default:
rule_api.add_option("pcre", pattern + new_opts);
- if ( relative )
- {
- if (buffer == "pcre_P_option_body")
- buffer = "pcre_P_option_body_rel";
- else if (buffer == "pcre_H_option_header")
- buffer = "pcre_H_option_header_rel";
- }
-
rule_api.set_curr_options_buffer(buffer);
return set_next_rule_state(data_stream);