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

@@ -174,6 +174,7 @@ modsecurity::RulesSet *setupModSecRules(RegressionTestResult *r) {
auto s = rules->getParserError();
if (regex_search(s, &match, re)) {
r->passed();
delete rules;
return nullptr;
}
}
@@ -187,6 +188,7 @@ modsecurity::RulesSet *setupModSecRules(RegressionTestResult *r) {
reason << KWHT << "Expected: " << RESET << r->getExpectedParserError() << std::endl;
reason << KWHT << "Produced: " << RESET << rules->getParserError() << std::endl;
r->failed(reason.str());
delete rules;
return nullptr;
}
@@ -278,6 +280,8 @@ void processRequest(
CustomDebugLog *d = reinterpret_cast<CustomDebugLog *>(rules->m_debugLog);
debug_log.assign(d->log_messages());
delete modsec_transaction;
*status_code = r.status;
}
@@ -398,9 +402,9 @@ int main(int argc, char **argv) {
ModSecurityTest<RegressionTest> test;
std::string ver(MODSECURITY_VERSION);
std::string envvar("MODSECURITY=ModSecurity " + ver + " regression tests");
std::string envvar("ModSecurity " + ver + " regression tests");
putenv(strdup(envvar.c_str()));
setenv("MODSECURITY", envvar.c_str(), 0);
#ifndef NO_LOGS
int test_number = 0;
#endif