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:
Felipe Zimmerle 2016-06-16 10:37:52 -03:00
parent 1b35e57c4e
commit 7be5fde62a
No known key found for this signature in database
GPG Key ID: E6DFB08CE8B11277
2 changed files with 35 additions and 14 deletions

View File

@ -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;
}

View File

@ -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;