diff --git a/headers/modsecurity/collection/variable.h b/headers/modsecurity/collection/variable.h index 91ddc536..c0881c09 100644 --- a/headers/modsecurity/collection/variable.h +++ b/headers/modsecurity/collection/variable.h @@ -33,10 +33,16 @@ namespace collection { class Variable { public: + Variable(const std::string *key) : + m_key(key), + m_value(), + m_dynamic_value(false), + m_dynamic(false) { } Variable(const std::string *key, const std::string *value) : m_key(key), m_value(value), - m_dynamic_value(false) { } + m_dynamic_value(false), + m_dynamic(false) { } ~Variable() { if (m_dynamic_value) { @@ -47,6 +53,7 @@ class Variable { const std::string *m_key; const std::string *m_value; bool m_dynamic_value; + bool m_dynamic; }; } // namespace collection diff --git a/src/rule.cc b/src/rule.cc index c950b292..91393a01 100644 --- a/src/rule.cc +++ b/src/rule.cc @@ -420,8 +420,10 @@ std::vector Rule::getFinalVars( trasn->debug(9, "Variable: " + *key + " is part of the exclusion list, skipping..."); #endif - delete v; - v = NULL; + if (v->m_dynamic) { + delete v; + v = NULL; + } continue; } @@ -439,8 +441,10 @@ std::vector Rule::getFinalVars( } } if (ignoreVariable) { - delete v; - v = NULL; + if (v->m_dynamic) { + delete v; + v = NULL; + } continue; } @@ -458,8 +462,10 @@ std::vector Rule::getFinalVars( } } if (ignoreVariable) { - delete v; - v = NULL; + if (v->m_dynamic) { + delete v; + v = NULL; + } continue; } @@ -636,7 +642,9 @@ end_clean: while (finalVars.empty() == false) { auto *a = finalVars.back(); finalVars.pop_back(); - delete a; + if (a->m_dynamic) { + delete a; + } } return false; @@ -654,7 +662,9 @@ end_exec: while (finalVars.empty() == false) { auto *a = finalVars.back(); finalVars.pop_back(); - delete a; + if (a->m_dynamic) { + delete a; + } } return true;