Removes memory leaks on the parse

- Parser location is now a custom class. It holds a shared pointer
  with the file name; If the parser fails, the resource is deleted.

 - To follow the parser change, the Rule class now holds the file
  name in a shared pointer instead of a unique pointer. As a shared
  pointer we avoid duplication of the file name in memory, plus,
  it frees itself when not in use anymore.

 - Operator init also accepting the filename as a shared pointer.

 - Driver is treating m_location was privative. Now it holds a
  std::list<std::shared_ptr<yy::seclang_parser::location_type>>
  instead of: std::list<yy::seclang_parser::location_type *>.

 - Fix: addSecRule on Driver() was changed from RuleWithAction to
  RuleWithOperator.

 - Minor changes on the regression and rules-check utility to force
  deletion of resources even when they fail.

 - Couple of virtual destructors were placed to force the shared
  pointer decrementing on shared variables.

 - Deleted constructors for copy were placed for the sake of
  readability.
This commit is contained in:
Felipe Zimmerle
2021-01-12 09:58:30 -03:00
parent 0bf36192a5
commit 9f47f1473c
54 changed files with 2134 additions and 2026 deletions

View File

@@ -44,8 +44,8 @@ class Operator;
class Rule {
public:
Rule(std::unique_ptr<std::string> fileName, int lineNumber)
: m_fileName(std::move(fileName)),
Rule(std::shared_ptr<std::string> fileName, int lineNumber)
: m_fileName(fileName),
m_lineNumber(lineNumber),
m_phase(modsecurity::Phases::RequestHeadersPhase)
{ }

View File

@@ -47,6 +47,17 @@ class Rules {
using iterator=typename container::iterator;
using const_iterator=typename container::const_iterator;
Rules()
: m_rules()
{ };
Rules(const Rules&) = delete;
virtual ~Rules() {
m_rules.clear();
}
int append(Rules *from);
bool insert(const std::shared_ptr<Rule> &rule);

View File

@@ -60,7 +60,8 @@ class RulesSet : public RulesSetProperties {
#endif
{ }
~RulesSet() { }
~RulesSet()
{ }
int loadFromUri(const char *uri);
int loadRemote(const char *key, const char *uri);

View File

@@ -47,6 +47,15 @@ class RulesSetPhases {
using iterator = typename container::iterator;
using const_iterator = typename container::const_iterator;
RulesSetPhases()
: m_rulesAtPhase()
{ }
RulesSetPhases(const RulesSetPhases&) = delete;
virtual ~RulesSetPhases()
{ };
void insert(std::shared_ptr<Rule> rule);
void append(RulesSetPhases *from);