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
No known key found for this signature in database
GPG Key ID: E6DFB08CE8B11277
5 changed files with 28 additions and 4 deletions

View File

@ -68,7 +68,7 @@ using MatchActions = std::vector<actions::Action *>;
class Rule { class Rule {
public: public:
Rule(std::unique_ptr<std::string> fileName, int lineNumber) 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_lineNumber(lineNumber),
m_phase(modsecurity::Phases::RequestHeadersPhase) { m_phase(modsecurity::Phases::RequestHeadersPhase) {
} }
@ -103,7 +103,10 @@ class Rule {
void setPhase(int phase) { m_phase = phase; } void setPhase(int phase) { m_phase = phase; }
virtual std::string getReference() { virtual std::string getReference() {
return *m_fileName + ":" + std::to_string(m_lineNumber); if (m_fileName) {
return *m_fileName + ":" + std::to_string(m_lineNumber);
}
return "<<no file>>:" + std::to_string(m_lineNumber);
} }

View File

@ -44,6 +44,16 @@ class RuleMarker : public Rule {
: Rule(std::move(fileName), lineNumber), : Rule(std::move(fileName), lineNumber),
m_name(std::make_shared<std::string>(name)) { } 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, virtual bool evaluate(Transaction *transaction,
std::shared_ptr<RuleMessage> rm) override { std::shared_ptr<RuleMessage> rm) override {

View File

@ -46,6 +46,15 @@ class RuleUnconditional : public RuleWithActions {
int lineNumber) int lineNumber)
: RuleWithActions(actions, transformations, std::move(fileName), 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; virtual bool evaluate(Transaction *transaction, std::shared_ptr<RuleMessage> ruleMessage) override;
private: private:

View File

@ -45,8 +45,8 @@ Driver::~Driver() {
int Driver::addSecMarker(std::string marker, std::unique_ptr<std::string> fileName, int lineNumber) { int Driver::addSecMarker(std::string marker, std::unique_ptr<std::string> fileName, int lineNumber) {
// FIXME: we might move this to the parser. // FIXME: we might move this to the parser.
for (int i = 0; i < modsecurity::Phases::NUMBER_OF_PHASES; i++) { for (int i = 0; i < modsecurity::Phases::NUMBER_OF_PHASES; i++) {
RuleMarker *r = new RuleMarker(marker, std::move(fileName), lineNumber); RuleMarker *r = new RuleMarker(marker, std::unique_ptr<std::string>(new std::string(*fileName)), lineNumber);
std::unique_ptr<RuleMarker> rule(std::move(r)); std::unique_ptr<RuleMarker> rule(r);
rule->setPhase(i); rule->setPhase(i);
m_rulesSetPhases.insert(std::move(rule)); m_rulesSetPhases.insert(std::move(rule));
} }

View File

@ -53,6 +53,8 @@ class RuleScript : public RuleWithActions {
m_name(name), m_name(name),
m_lua() { } m_lua() { }
RuleScript(const RuleWithActions& r) = delete;
bool init(std::string *err); bool init(std::string *err);
bool evaluate(Transaction *trans, bool evaluate(Transaction *trans,
std::shared_ptr<RuleMessage> ruleMessage) override; std::shared_ptr<RuleMessage> ruleMessage) override;