Description
Creating and removing a ruleset is causing a memory leak in version 3.3
I am observing a memory leak with the operator objects not being freed, once the ruleset is cleaned up.
With a test program that initializes modsecurity, reads a ruleset and cleans up the ruleset
Code fragment:
global_modsec = msc_init();
global_rules = msc_create_rules_set();
const char* error = NULL;
msc_rules_add_file(global_rules, "rules.conf", &error);
msc_rules_cleanup(global_rules);
msc_cleanup(global_modsec);
I see memory leaks:
==1836==
==1836== 142,421,048 bytes in 30,350 blocks are possibly lost in loss record 410 of 412
==1836== at 0x4C2C089: calloc (vg_replace_malloc.c:762)
==1836== by 0x4FBAFDD: acmp_add_pattern (acmp.cc:517)
==1836== by 0x4FA4CBB: modsecurity::operators::Pm::init(std::string const&, std::string*) (pm.cc:136)
==1836== by 0x4EFF823: yy::seclang_parser::parse() (seclang-parser.yy:874)
==1836== by 0x4F39373: modsecurity::Parser::Driver::parse(std::string const&, std::string const&) (driver.cc:145)
==1836== by 0x4F39697: modsecurity::Parser::Driver::parseFile(std::string const&) (driver.cc:189)
==1836== by 0x4F50CC6: modsecurity::RulesSet::loadFromUri(char const*) (rules_set.cc:53)
==1836== by 0x4F52542: msc_rules_add_file (rules_set.cc:296)
==1836== by 0x4011D7: process_rules (modsec_memory.c:15)
==1836== by 0x40126C: main (modsec_memory.c:33)
==1836==
==1836== 569,323,113 (1,344 direct, 569,321,769 indirect) bytes in 21 blocks are definitely lost in loss record 412 of 412
==1836== at 0x4C2A593: operator new(unsigned long) (vg_replace_malloc.c:344)
==1836== by 0x4EF56B1: yy::seclang_parser::parse() (seclang-parser.yy:1032)
==1836== by 0x4F39373: modsecurity::Parser::Driver::parse(std::string const&, std::string const&) (driver.cc:145)
==1836== by 0x4F39697: modsecurity::Parser::Driver::parseFile(std::string const&) (driver.cc:189)
==1836== by 0x4F50CC6: modsecurity::RulesSet::loadFromUri(char const*) (rules_set.cc:53)
==1836== by 0x4F52542: msc_rules_add_file (rules_set.cc:296)
==1836== by 0x4011D7: process_rules (modsec_memory.c:15)
==1836== by 0x40126C: main (modsec_memory.c:33)
How do we deallocate the memory used by the parser?
the 'pm' operator, if used with a large set of phrases can cause a huge leak.