From 39848e5564398575526dc574696acab1ef2a4e29 Mon Sep 17 00:00:00 2001 From: Ervin Hegedus Date: Wed, 27 Mar 2024 11:45:05 +0100 Subject: [PATCH 1/7] Fix memleak in regression.cc --- test/regression/regression.cc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/test/regression/regression.cc b/test/regression/regression.cc index 6343c9e1c3..1a6b764669 100644 --- a/test/regression/regression.cc +++ b/test/regression/regression.cc @@ -476,7 +476,9 @@ int main(int argc, char **argv) { std::string ver(MODSECURITY_VERSION); std::string envvar("MODSECURITY=ModSecurity " + ver + " regression tests"); - putenv(strdup(envvar.c_str())); + char *envvarptr = strdup(envvar.c_str()); + + putenv(envvarptr); #ifndef NO_LOGS int test_number = 0; #endif @@ -536,6 +538,9 @@ int main(int argc, char **argv) { if (test.m_count_all) { std::cout << std::to_string(keyList.size()) << std::endl; + if (envvarptr != nullptr) { + free(envvarptr); + } exit(0); } @@ -606,5 +611,9 @@ int main(int argc, char **argv) { } #endif + if (envvarptr != nullptr) { + free(envvarptr); + } + return 0; } From 5b2404e44d8afbd979227a5fa2acb69622f6d694 Mon Sep 17 00:00:00 2001 From: Ervin Hegedus Date: Wed, 27 Mar 2024 11:45:36 +0100 Subject: [PATCH 2/7] Fix memleak in rules-check.cc --- tools/rules-check/rules-check.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/rules-check/rules-check.cc b/tools/rules-check/rules-check.cc index f59439ee9f..b1b974a4db 100644 --- a/tools/rules-check/rules-check.cc +++ b/tools/rules-check/rules-check.cc @@ -41,6 +41,7 @@ int main(int argc, char **argv) { if (*args == NULL) { print_help(argv[0]); + delete rules; return 0; } @@ -50,6 +51,7 @@ int main(int argc, char **argv) { const char *arg = *args; std::string err; int r; + bool need_free = false; if (argFull.empty() == false) { if (arg[strlen(arg)-1] == '\"') { @@ -72,6 +74,7 @@ int main(int argc, char **argv) { if (argFull.empty() == false) { arg = strdup(argFull.c_str()); + need_free = true; argFull.clear(); } @@ -81,6 +84,9 @@ int main(int argc, char **argv) { } else { r = rules->load(arg); } + if(need_free == true && arg != nullptr) { + free((void*)arg); + } if (r < 0) { err.assign(rules->m_parserError.str()); rules->m_parserError.str(""); From 4085ff553624121d6cd76d20064394e4d6d21c1a Mon Sep 17 00:00:00 2001 From: Ervin Hegedus Date: Wed, 27 Mar 2024 13:14:11 +0100 Subject: [PATCH 3/7] Replace putenv by setenv --- test/regression/regression.cc | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/test/regression/regression.cc b/test/regression/regression.cc index 1a6b764669..56eb43c80f 100644 --- a/test/regression/regression.cc +++ b/test/regression/regression.cc @@ -474,11 +474,9 @@ int main(int argc, char **argv) { ModSecurityTest test; std::string ver(MODSECURITY_VERSION); - std::string envvar("MODSECURITY=ModSecurity " + ver + " regression tests"); + std::string envvar("ModSecurity " + ver + " regression tests"); - char *envvarptr = strdup(envvar.c_str()); - - putenv(envvarptr); + setenv("MODSECURITY", envvar.c_str(), 1); #ifndef NO_LOGS int test_number = 0; #endif @@ -538,9 +536,6 @@ int main(int argc, char **argv) { if (test.m_count_all) { std::cout << std::to_string(keyList.size()) << std::endl; - if (envvarptr != nullptr) { - free(envvarptr); - } exit(0); } @@ -611,9 +606,6 @@ int main(int argc, char **argv) { } #endif - if (envvarptr != nullptr) { - free(envvarptr); - } return 0; } From ca7c0ae0b94b0daad932aef25fa0fc0e99ef64dd Mon Sep 17 00:00:00 2001 From: Ervin Hegedus Date: Wed, 27 Mar 2024 16:19:38 +0100 Subject: [PATCH 4/7] Code refactorization --- tools/rules-check/rules-check.cc | 50 +++++++++----------------------- 1 file changed, 13 insertions(+), 37 deletions(-) diff --git a/tools/rules-check/rules-check.cc b/tools/rules-check/rules-check.cc index b1b974a4db..9061f9f117 100644 --- a/tools/rules-check/rules-check.cc +++ b/tools/rules-check/rules-check.cc @@ -32,61 +32,39 @@ void print_help(const char *name) { int main(int argc, char **argv) { - modsecurity::RulesSet *rules; + std::unique_ptr rules (new modsecurity::RulesSet()); char **args = argv; - rules = new modsecurity::RulesSet(); int ret = 0; args++; if (*args == NULL) { print_help(argv[0]); - delete rules; return 0; } while (*args != NULL) { struct stat buffer; - std::string argFull(""); - const char *arg = *args; + std::string arg = (*args); std::string err; int r; - bool need_free = false; - - if (argFull.empty() == false) { - if (arg[strlen(arg)-1] == '\"') { - argFull.append(arg, strlen(arg)-1); - goto next; - } else { - argFull.append(arg); - goto next; - } - } - if (arg[0] == '\"' && argFull.empty() == true) { - if (arg[strlen(arg)-1] == '\"') { - argFull.append(arg+1, strlen(arg) - 2); - } else { - argFull.append(arg+1); - goto next; - } - } + // strip arg from leading and trailing '"' chars + arg.erase(arg.find_last_not_of('\"')+1); + arg.erase(0, arg.find_first_not_of('\"')); - if (argFull.empty() == false) { - arg = strdup(argFull.c_str()); - need_free = true; - argFull.clear(); + if (arg.empty() == true) { + args++; + continue; } std::cout << " : " << arg << " -- "; - if (stat(arg, &buffer) == 0) { - r = rules->loadFromUri(arg); + if (stat(arg.c_str(), &buffer) == 0) { + r = rules->loadFromUri(arg.c_str()); } else { - r = rules->load(arg); - } - if(need_free == true && arg != nullptr) { - free((void*)arg); + r = rules->load(arg.c_str()); } + if (r < 0) { err.assign(rules->m_parserError.str()); rules->m_parserError.str(""); @@ -97,12 +75,10 @@ int main(int argc, char **argv) { if (err.empty() == false) { std::cerr << " " << err << std::endl; } -next: + args++; } - delete rules; - if (ret < 0) { std::cout << "Test failed." << std::endl; } else { From 1b6b63161706e21511a536ac8ba740fcc475c418 Mon Sep 17 00:00:00 2001 From: Ervin Hegedus Date: Wed, 27 Mar 2024 16:33:05 +0100 Subject: [PATCH 5/7] Use make_unique to create unique ptr --- tools/rules-check/rules-check.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/rules-check/rules-check.cc b/tools/rules-check/rules-check.cc index 9061f9f117..f494d0c3ee 100644 --- a/tools/rules-check/rules-check.cc +++ b/tools/rules-check/rules-check.cc @@ -32,7 +32,7 @@ void print_help(const char *name) { int main(int argc, char **argv) { - std::unique_ptr rules (new modsecurity::RulesSet()); + std::unique_ptr rules = std::make_unique(); char **args = argv; int ret = 0; @@ -45,7 +45,7 @@ int main(int argc, char **argv) { while (*args != NULL) { struct stat buffer; - std::string arg = (*args); + std::string arg = *args; std::string err; int r; From cdb6b839e1de54ce126a2cc8e97a9f2c2846b5a9 Mon Sep 17 00:00:00 2001 From: Ervin Hegedus Date: Wed, 27 Mar 2024 16:39:32 +0100 Subject: [PATCH 6/7] Replaced variable type to 'auto' --- tools/rules-check/rules-check.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/rules-check/rules-check.cc b/tools/rules-check/rules-check.cc index f494d0c3ee..48cc465ace 100644 --- a/tools/rules-check/rules-check.cc +++ b/tools/rules-check/rules-check.cc @@ -32,7 +32,7 @@ void print_help(const char *name) { int main(int argc, char **argv) { - std::unique_ptr rules = std::make_unique(); + auto rules = std::make_unique(); char **args = argv; int ret = 0; From 6cffa8f90416cd68044c533328e34e18d3f14be4 Mon Sep 17 00:00:00 2001 From: Ervin Hegedus Date: Mon, 5 Aug 2024 14:30:26 +0200 Subject: [PATCH 7/7] Add _putenv() in case of WIN32 port instead of setenv() --- test/regression/regression.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/regression/regression.cc b/test/regression/regression.cc index 61df08385f..a6ede61c72 100644 --- a/test/regression/regression.cc +++ b/test/regression/regression.cc @@ -482,7 +482,12 @@ int main(int argc, char **argv) { std::string ver(MODSECURITY_VERSION); std::string envvar("ModSecurity " + ver + " regression tests"); +#ifndef WIN32 setenv("MODSECURITY", envvar.c_str(), 1); +#else + _putenv_s("MODSECURITY", envvar.c_str()); +#endif + #ifndef NO_LOGS int test_number = 0; #endif