Skip to content

memory leak in msc_rules_add_file / msc_rules_cleanup #2710

Closed
@liudongmiao

Description

@liudongmiao

There are reports on memory leak on nginx -s reload, #2381 #2502 #2552 #2636 and many others .
Of course, #2580 doesn't solve problems. (Update: #2580 should have fixed this problem.)

There is a simple poc:

#include <stdio.h>
#include <unistd.h>
#include "modsecurity/rules_set.h"

int main(int argc, char **argv) {
    int i;
    char *file;
    const char *error;
#ifdef __APPLE__
    printf("top -pid %d\n", getpid());
#else
    printf("top -p %d\n", getpid());
#endif
    file = argc > 1 ? argv[1] : "memory-leak.conf";
    printf("rules file: %s\n", file);
    for (i = 0; i < 100; ++i) {
        RulesSet *rules_set = msc_create_rules_set();
        if (msc_rules_add_file(rules_set, file, &error) < 0) {
            fprintf(stderr, "error: %s\n", error);
            break;
        }
        msc_rules_cleanup(rules_set);
    }
    printf("100 iter completed\n");
    sleep(100);
    return 0;
}

After run 100 times on CRS rules, the memory grow to 1.2G, about 12M for rules.

Include modsecurity-v3.0.6/modsecurity.conf-recommended
Include coreruleset-3.3.2/crs-setup.conf.example
Include coreruleset-3.3.2/rules/*.conf

Of course, for nginx -s reload, it may be solved by moving msc_rules_add_file to working process, then it doesn't affect master process, and sovle the problem.

However, IMO, it should be fixed in ModSecurity, as we have shared_ptr in c++11.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions