diff --git a/CHANGES b/CHANGES index 5841fe55..9f834faf 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,8 @@ v3.x.y - YYYY-MMM-DD (to be released) ------------------------------------- + - Fix memory leak of RuleMessages objects + [#2376 - @WGH-, @martinhsv] - Produce not-supported error for ctl:forceRequestBodyVariable and ctl:auditEngine [#2376 - @WGH-, @martinhsv] diff --git a/headers/modsecurity/transaction.h b/headers/modsecurity/transaction.h index 7d2d0c87..80a38106 100644 --- a/headers/modsecurity/transaction.h +++ b/headers/modsecurity/transaction.h @@ -343,7 +343,7 @@ class TransactionRuleMessageManagement { * of the actions: `log_data' and `msg'. These should be included on the * auditlogs. */ - std::list m_rulesMessages; + std::list> m_rulesMessages; Transaction *m_transaction; }; diff --git a/src/transaction.cc b/src/transaction.cc index d43e26de..3927fd0a 100644 --- a/src/transaction.cc +++ b/src/transaction.cc @@ -64,11 +64,11 @@ namespace modsecurity { RuleMessage *TransactionRuleMessageManagement::messageGetLast() { - return m_rulesMessages.back(); + return m_rulesMessages.back().get(); } void TransactionRuleMessageManagement::logMatchLastRuleOnTheChain(const RuleWithActions *rule) { - RuleMessage *rm = m_rulesMessages.back(); + RuleMessage *rm = m_rulesMessages.back().get(); rm->setRule(rule); @@ -85,13 +85,13 @@ void TransactionRuleMessageManagement::logMatchLastRuleOnTheChain(const RuleWith } void TransactionRuleMessageManagement::messageNew() { - m_rulesMessages.push_back(new RuleMessage(m_transaction)); + m_rulesMessages.push_back(std::make_shared(m_transaction)); } std::list TransactionRuleMessageManagement::messageGetAll() { std::list messages; - for (RuleMessage *a : m_rulesMessages) { - messages.push_back(a); + for (auto iter = m_rulesMessages.begin(); iter != m_rulesMessages.end(); ++iter) { + messages.push_back((*iter).get()); } return messages; }