Fix rules dump

The unique pointer for file name was being used multiple times
on SecMarker.
This commit is contained in:
Felipe Zimmerle
2021-02-04 11:07:22 -03:00
parent 6ca028b6f5
commit 50fc347ed4
5 changed files with 28 additions and 4 deletions

View File

@@ -68,7 +68,7 @@ using MatchActions = std::vector<actions::Action *>;
class Rule {
public:
Rule(std::unique_ptr<std::string> fileName, int lineNumber)
: m_fileName(std::move(fileName)),
: m_fileName(std::make_shared<std::string>(*fileName)),
m_lineNumber(lineNumber),
m_phase(modsecurity::Phases::RequestHeadersPhase) {
}
@@ -103,8 +103,11 @@ class Rule {
void setPhase(int phase) { m_phase = phase; }
virtual std::string getReference() {
if (m_fileName) {
return *m_fileName + ":" + std::to_string(m_lineNumber);
}
return "<<no file>>:" + std::to_string(m_lineNumber);
}
virtual bool isMarker() { return false; }

View File

@@ -44,6 +44,16 @@ class RuleMarker : public Rule {
: Rule(std::move(fileName), lineNumber),
m_name(std::make_shared<std::string>(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<RuleMessage> rm) override {

View File

@@ -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> ruleMessage) override;
private:

View File

@@ -45,8 +45,8 @@ Driver::~Driver() {
int Driver::addSecMarker(std::string marker, std::unique_ptr<std::string> 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<RuleMarker> rule(std::move(r));
RuleMarker *r = new RuleMarker(marker, std::unique_ptr<std::string>(new std::string(*fileName)), lineNumber);
std::unique_ptr<RuleMarker> rule(r);
rule->setPhase(i);
m_rulesSetPhases.insert(std::move(rule));
}

View File

@@ -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> ruleMessage) override;