mirror of
https://github.com/owasp-modsecurity/ModSecurity.git
synced 2025-08-15 23:55:03 +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 "operators/pm.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
@ -29,14 +31,39 @@ namespace modsecurity {
|
|||||||
namespace operators {
|
namespace operators {
|
||||||
|
|
||||||
Pm::~Pm() {
|
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);
|
node = root;
|
||||||
m_p->root_node = NULL;
|
cleanup(root);
|
||||||
if (m_p) {
|
|
||||||
free(m_p);
|
free(m_p);
|
||||||
m_p = NULL;
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
postOrderTraversal(node->left);
|
|
||||||
postOrderTraversal(node->right);
|
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);
|
free(node);
|
||||||
node = NULL;
|
node = NULL;
|
||||||
}
|
}
|
||||||
|
@ -41,6 +41,7 @@ class Pm : public Operator {
|
|||||||
|
|
||||||
bool init(const std::string &file, std::string *error) override;
|
bool init(const std::string &file, std::string *error) override;
|
||||||
void postOrderTraversal(acmp_btree_node_t *node);
|
void postOrderTraversal(acmp_btree_node_t *node);
|
||||||
|
void cleanup(acmp_node_t *n);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
ACMP *m_p;
|
ACMP *m_p;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user