diff --git a/headers/modsecurity/actions/action.h b/headers/modsecurity/actions/action.h index 9df52dfc..d28fd75d 100644 --- a/headers/modsecurity/actions/action.h +++ b/headers/modsecurity/actions/action.h @@ -41,7 +41,7 @@ class Action { : action_kind(2), m_isNone(false), m_name(""), - m_referenceCount(0), + m_referenceCount(1), m_parser_payload(""), temporaryAction(false) { set_name_and_payload(_action); @@ -50,7 +50,7 @@ class Action { : action_kind(kind), m_isNone(false), m_name(""), - m_referenceCount(0), + m_referenceCount(1), m_parser_payload(""), temporaryAction(false) { set_name_and_payload(_action); @@ -91,11 +91,13 @@ class Action { } } - void refCountDecreaseAndCheck() { + int refCountDecreaseAndCheck() { this->m_referenceCount--; if (this->m_referenceCount == 0) { delete this; + return 1; } + return 0; } void refCountIncrease() { diff --git a/headers/modsecurity/rule.h b/headers/modsecurity/rule.h index 8809a859..d31c9829 100644 --- a/headers/modsecurity/rule.h +++ b/headers/modsecurity/rule.h @@ -84,15 +84,17 @@ class Rule { Rule *chainedRule; bool chained; - void refCountDecreaseAndCheck() { - this->m_referenceCount--; - if (this->m_referenceCount == 0) { + int refCountDecreaseAndCheck() { + m_referenceCount--; + if (m_referenceCount == 0) { delete this; + return 1; } + return 0; } void refCountIncrease() { - this->m_referenceCount++; + m_referenceCount++; } std::string m_rev; diff --git a/headers/modsecurity/rules_properties.h b/headers/modsecurity/rules_properties.h index 3ff59246..22742507 100644 --- a/headers/modsecurity/rules_properties.h +++ b/headers/modsecurity/rules_properties.h @@ -102,6 +102,29 @@ class RulesProperties { ~RulesProperties() { + int i = 0; + /** Cleanup the rules */ + for (i = 0; i < modsecurity::Phases::NUMBER_OF_PHASES; i++) { + std::vector rules = m_rules[i]; + while (rules.empty() == false) { + Rule *rule = rules.back(); + rules.pop_back(); + if (rule->refCountDecreaseAndCheck()) { + rule = NULL; + } + } + } + for (i = 0; i < modsecurity::Phases::NUMBER_OF_PHASES; i++) { + std::vector *tmp = &m_defaultActions[i]; + while (tmp->empty() == false) { + actions::Action *a = tmp->back(); + tmp->pop_back(); + if (a->refCountDecreaseAndCheck()) { + a = NULL; + } + } + } + delete m_debugLog; delete m_auditLog; } diff --git a/src/rule.cc b/src/rule.cc index c5bddaaf..2e3fb77a 100644 --- a/src/rule.cc +++ b/src/rule.cc @@ -94,7 +94,7 @@ Rule::Rule(std::string marker) m_secmarker(true), m_marker(marker), m_maturity(0), - m_referenceCount(0), + m_referenceCount(1), m_fileName(""), m_lineNumber(0) { } @@ -113,7 +113,7 @@ Rule::Rule(Operator *_op, m_secmarker(false), m_marker(""), m_maturity(0), - m_referenceCount(0), + m_referenceCount(1), m_fileName(fileName), m_lineNumber(lineNumber) { if (actions != NULL) { diff --git a/src/rules.cc b/src/rules.cc index 23886f9c..81e3e767 100644 --- a/src/rules.cc +++ b/src/rules.cc @@ -78,28 +78,8 @@ void Rules::decrementReferenceCount(void) { Rules::~Rules() { - int i = 0; - free(unicode_map_table); unicode_map_table = NULL; - - /** Cleanup the rules */ - for (int i = 0; i < modsecurity::Phases::NUMBER_OF_PHASES; i++) { - std::vector rules = m_rules[i]; - while (rules.empty() == false) { - Rule *rule = rules.back(); - rule->refCountDecreaseAndCheck(); - rules.pop_back(); - } - } - for (i = 0; i < modsecurity::Phases::NUMBER_OF_PHASES; i++) { - std::vector *tmp = &m_defaultActions[i]; - while (tmp->empty() == false) { - actions::Action *a = tmp->back(); - a->refCountDecreaseAndCheck(); - tmp->pop_back(); - } - } }