Skip to content

Commit 50fc347

Browse files
committed
Fix rules dump
The unique pointer for file name was being used multiple times on SecMarker.
1 parent 6ca028b commit 50fc347

File tree

5 files changed

+28
-4
lines changed

5 files changed

+28
-4
lines changed

headers/modsecurity/rule.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ using MatchActions = std::vector<actions::Action *>;
6868
class Rule {
6969
public:
7070
Rule(std::unique_ptr<std::string> fileName, int lineNumber)
71-
: m_fileName(std::move(fileName)),
71+
: m_fileName(std::make_shared<std::string>(*fileName)),
7272
m_lineNumber(lineNumber),
7373
m_phase(modsecurity::Phases::RequestHeadersPhase) {
7474
}
@@ -103,7 +103,10 @@ class Rule {
103103
void setPhase(int phase) { m_phase = phase; }
104104

105105
virtual std::string getReference() {
106-
return *m_fileName + ":" + std::to_string(m_lineNumber);
106+
if (m_fileName) {
107+
return *m_fileName + ":" + std::to_string(m_lineNumber);
108+
}
109+
return "<<no file>>:" + std::to_string(m_lineNumber);
107110
}
108111

109112

headers/modsecurity/rule_marker.h

+10
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,16 @@ class RuleMarker : public Rule {
4444
: Rule(std::move(fileName), lineNumber),
4545
m_name(std::make_shared<std::string>(name)) { }
4646

47+
RuleMarker(const RuleMarker& r) :
48+
Rule(r),
49+
m_name(r.m_name)
50+
{ }
51+
52+
RuleMarker &operator =(const RuleMarker& r) {
53+
Rule::operator = (r);
54+
m_name = r.m_name;
55+
return *this;
56+
}
4757

4858
virtual bool evaluate(Transaction *transaction,
4959
std::shared_ptr<RuleMessage> rm) override {

headers/modsecurity/rule_unconditional.h

+9
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,15 @@ class RuleUnconditional : public RuleWithActions {
4646
int lineNumber)
4747
: RuleWithActions(actions, transformations, std::move(fileName), lineNumber) { }
4848

49+
RuleUnconditional(const RuleUnconditional& r)
50+
: RuleWithActions(r)
51+
{ }
52+
53+
RuleUnconditional &operator=(const RuleUnconditional& r) {
54+
RuleWithActions::operator = (r);
55+
return *this;
56+
}
57+
4958
virtual bool evaluate(Transaction *transaction, std::shared_ptr<RuleMessage> ruleMessage) override;
5059

5160
private:

src/parser/driver.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ Driver::~Driver() {
4545
int Driver::addSecMarker(std::string marker, std::unique_ptr<std::string> fileName, int lineNumber) {
4646
// FIXME: we might move this to the parser.
4747
for (int i = 0; i < modsecurity::Phases::NUMBER_OF_PHASES; i++) {
48-
RuleMarker *r = new RuleMarker(marker, std::move(fileName), lineNumber);
49-
std::unique_ptr<RuleMarker> rule(std::move(r));
48+
RuleMarker *r = new RuleMarker(marker, std::unique_ptr<std::string>(new std::string(*fileName)), lineNumber);
49+
std::unique_ptr<RuleMarker> rule(r);
5050
rule->setPhase(i);
5151
m_rulesSetPhases.insert(std::move(rule));
5252
}

src/rule_script.h

+2
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ class RuleScript : public RuleWithActions {
5353
m_name(name),
5454
m_lua() { }
5555

56+
RuleScript(const RuleWithActions& r) = delete;
57+
5658
bool init(std::string *err);
5759
bool evaluate(Transaction *trans,
5860
std::shared_ptr<RuleMessage> ruleMessage) override;

0 commit comments

Comments
 (0)