From 50fc347ed4d0852d54561e15559de07c698fbb16 Mon Sep 17 00:00:00 2001 From: Felipe Zimmerle Date: Thu, 4 Feb 2021 11:07:22 -0300 Subject: [PATCH] Fix rules dump The unique pointer for file name was being used multiple times on SecMarker. --- headers/modsecurity/rule.h | 7 +++++-- headers/modsecurity/rule_marker.h | 10 ++++++++++ headers/modsecurity/rule_unconditional.h | 9 +++++++++ src/parser/driver.cc | 4 ++-- src/rule_script.h | 2 ++ 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/headers/modsecurity/rule.h b/headers/modsecurity/rule.h index 7f6daf6b..b10e0556 100644 --- a/headers/modsecurity/rule.h +++ b/headers/modsecurity/rule.h @@ -68,7 +68,7 @@ using MatchActions = std::vector; class Rule { public: Rule(std::unique_ptr fileName, int lineNumber) - : m_fileName(std::move(fileName)), + : m_fileName(std::make_shared(*fileName)), m_lineNumber(lineNumber), m_phase(modsecurity::Phases::RequestHeadersPhase) { } @@ -103,7 +103,10 @@ class Rule { void setPhase(int phase) { m_phase = phase; } virtual std::string getReference() { - return *m_fileName + ":" + std::to_string(m_lineNumber); + if (m_fileName) { + return *m_fileName + ":" + std::to_string(m_lineNumber); + } + return "<>:" + std::to_string(m_lineNumber); } diff --git a/headers/modsecurity/rule_marker.h b/headers/modsecurity/rule_marker.h index 6d4c173b..b8b835ef 100644 --- a/headers/modsecurity/rule_marker.h +++ b/headers/modsecurity/rule_marker.h @@ -44,6 +44,16 @@ class RuleMarker : public Rule { : Rule(std::move(fileName), lineNumber), m_name(std::make_shared(name)) { } + RuleMarker(const RuleMarker& r) : + Rule(r), + m_name(r.m_name) + { } + + RuleMarker &operator =(const RuleMarker& r) { + Rule::operator = (r); + m_name = r.m_name; + return *this; + } virtual bool evaluate(Transaction *transaction, std::shared_ptr rm) override { diff --git a/headers/modsecurity/rule_unconditional.h b/headers/modsecurity/rule_unconditional.h index af72201f..c66fa7c1 100644 --- a/headers/modsecurity/rule_unconditional.h +++ b/headers/modsecurity/rule_unconditional.h @@ -46,6 +46,15 @@ class RuleUnconditional : public RuleWithActions { int lineNumber) : RuleWithActions(actions, transformations, std::move(fileName), lineNumber) { } + RuleUnconditional(const RuleUnconditional& r) + : RuleWithActions(r) + { } + + RuleUnconditional &operator=(const RuleUnconditional& r) { + RuleWithActions::operator = (r); + return *this; + } + virtual bool evaluate(Transaction *transaction, std::shared_ptr ruleMessage) override; private: diff --git a/src/parser/driver.cc b/src/parser/driver.cc index 8b4834c1..c8d15b48 100644 --- a/src/parser/driver.cc +++ b/src/parser/driver.cc @@ -45,8 +45,8 @@ Driver::~Driver() { int Driver::addSecMarker(std::string marker, std::unique_ptr fileName, int lineNumber) { // FIXME: we might move this to the parser. for (int i = 0; i < modsecurity::Phases::NUMBER_OF_PHASES; i++) { - RuleMarker *r = new RuleMarker(marker, std::move(fileName), lineNumber); - std::unique_ptr rule(std::move(r)); + RuleMarker *r = new RuleMarker(marker, std::unique_ptr(new std::string(*fileName)), lineNumber); + std::unique_ptr rule(r); rule->setPhase(i); m_rulesSetPhases.insert(std::move(rule)); } diff --git a/src/rule_script.h b/src/rule_script.h index 92c5dc6d..237ad6ab 100644 --- a/src/rule_script.h +++ b/src/rule_script.h @@ -53,6 +53,8 @@ class RuleScript : public RuleWithActions { m_name(name), m_lua() { } + RuleScript(const RuleWithActions& r) = delete; + bool init(std::string *err); bool evaluate(Transaction *trans, std::shared_ptr ruleMessage) override;