From 7be5fde62a0050cf46cf688806bc57fa606eaad9 Mon Sep 17 00:00:00 2001 From: Felipe Zimmerle Date: Thu, 16 Jun 2016 10:37:52 -0300 Subject: [PATCH] Fix memory leak on the @pm operator Binary tree was not being cleaned right, now looking (and cleaning) the sibling nodes. --- src/operators/pm.cc | 48 ++++++++++++++++++++++++++++++++------------- src/operators/pm.h | 1 + 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/operators/pm.cc b/src/operators/pm.cc index 65d16912..bb6376f9 100644 --- a/src/operators/pm.cc +++ b/src/operators/pm.cc @@ -15,6 +15,8 @@ #include "operators/pm.h" +#include + #include #include #include @@ -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; } diff --git a/src/operators/pm.h b/src/operators/pm.h index 7a882157..ff994e40 100644 --- a/src/operators/pm.h +++ b/src/operators/pm.h @@ -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;