mirror of
https://github.com/owasp-modsecurity/ModSecurity.git
synced 2025-08-14 05:45:59 +03:00
Fix memory leak on the @pm operator
Binary tree was not being cleaned right, now looking (and cleaning) the sibling nodes.
This commit is contained in:
parent
1b35e57c4e
commit
7be5fde62a
@ -15,6 +15,8 @@
|
||||
|
||||
#include "operators/pm.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <string>
|
||||
#include <algorithm>
|
||||
#include <iterator>
|
||||
@ -29,14 +31,39 @@ namespace modsecurity {
|
||||
namespace operators {
|
||||
|
||||
Pm::~Pm() {
|
||||
postOrderTraversal(m_p->root_node->btree);
|
||||
acmp_node_t *root = m_p->root_node;
|
||||
acmp_node_t *node = root;
|
||||
|
||||
free(m_p->root_node);
|
||||
m_p->root_node = NULL;
|
||||
if (m_p) {
|
||||
free(m_p);
|
||||
m_p = NULL;
|
||||
node = root;
|
||||
cleanup(root);
|
||||
|
||||
free(m_p);
|
||||
m_p = NULL;
|
||||
}
|
||||
|
||||
|
||||
void Pm::cleanup(acmp_node_t *n) {
|
||||
if (n == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
cleanup(n->sibling);
|
||||
cleanup(n->child);
|
||||
|
||||
postOrderTraversal(n->btree);
|
||||
|
||||
if (n->text && strlen(n->text) > 0) {
|
||||
free(n->text);
|
||||
n->text = NULL;
|
||||
}
|
||||
|
||||
if (n->pattern && strlen(n->pattern) > 0) {
|
||||
free(n->pattern);
|
||||
n->pattern = NULL;
|
||||
}
|
||||
|
||||
free(n);
|
||||
n = NULL;
|
||||
}
|
||||
|
||||
|
||||
@ -45,16 +72,9 @@ void Pm::postOrderTraversal(acmp_btree_node_t *node) {
|
||||
return;
|
||||
}
|
||||
|
||||
postOrderTraversal(node->left);
|
||||
postOrderTraversal(node->right);
|
||||
postOrderTraversal(node->left);
|
||||
|
||||
if (node->node->text) {
|
||||
free(node->node->text);
|
||||
node->node->text = NULL;
|
||||
}
|
||||
|
||||
free(node->node);
|
||||
node->node = NULL;
|
||||
free(node);
|
||||
node = NULL;
|
||||
}
|
||||
|
@ -41,6 +41,7 @@ class Pm : public Operator {
|
||||
|
||||
bool init(const std::string &file, std::string *error) override;
|
||||
void postOrderTraversal(acmp_btree_node_t *node);
|
||||
void cleanup(acmp_node_t *n);
|
||||
|
||||
protected:
|
||||
ACMP *m_p;
|
||||
|
Loading…
x
Reference in New Issue
Block a user