From 5520cac94f36e9c6b56f8a4100f73e8bacee5bf9 Mon Sep 17 00:00:00 2001 From: chenuduss Date: Mon, 14 Sep 2026 16:33:25 +0300 Subject: [PATCH 1/9] add return value to acmp_build_binary_tree and check it result --- src/utils/acmp.cc | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/utils/acmp.cc b/src/utils/acmp.cc index 1ca93b984..771da0283 100644 --- a/src/utils/acmp.cc +++ b/src/utils/acmp.cc @@ -206,7 +206,7 @@ static void acmp_add_btree_leaves(acmp_btree_node_t *node, acmp_node_t *nodes[], /** * Builds balanced binary tree from children nodes of given node. */ -static void acmp_build_binary_tree(ACMP *parser, acmp_node_t *node) { +static bool acmp_build_binary_tree(ACMP *parser, acmp_node_t *node) { size_t count, i, j; acmp_node_t *child = node->child; acmp_node_t **nodes; @@ -215,7 +215,7 @@ static void acmp_build_binary_tree(ACMP *parser, acmp_node_t *node) { /* Build an array big enough */ for (count = 0; child != NULL; child = child->sibling) count++; nodes = (acmp_node_t **)calloc(1, count * sizeof(acmp_node_t *)); - /* ENH: Check alloc succeded */ + if (!nodes) return false; /* ENH: Combine this in the loop below - we do not need two loops */ child = node->child; @@ -236,24 +236,32 @@ static void acmp_build_binary_tree(ACMP *parser, acmp_node_t *node) { nodes[i] = nodes[j]; nodes[j] = tmp; } - } + } if (node->btree != NULL) { free(node->btree); node->btree = NULL; } node->btree = reinterpret_cast(calloc(1, sizeof(acmp_btree_node_t))); + if (!(node->btree)) { + free(nodes); + return false; + } - /* ENH: Check alloc succeded */ pos = count / 2; node->btree->node = nodes[pos]; node->btree->letter = nodes[pos]->letter; acmp_add_btree_leaves(node->btree, nodes, pos, -1, count); for (i = 0; i < count; i++) { - if (nodes[i]->child != NULL) acmp_build_binary_tree(parser, nodes[i]); - } - if (nodes != NULL) { - free(nodes); + if (nodes[i]->child != NULL) + if (!acmp_build_binary_tree(parser, nodes[i])) { + free(nodes); + return false; + } } + + free(nodes); + return true; + } /** @@ -305,7 +313,11 @@ static int acmp_connect_fail_branches(ACMP *parser) { } acmp_connect_other_matches(parser, parser->root_node); - if (parser->root_node->child != NULL) acmp_build_binary_tree(parser, parser->root_node); + if (parser->root_node->child != NULL) { + if (!acmp_build_binary_tree(parser, parser->root_node)) { + return 0; + } + } parser->is_failtree_done = 1; return 1; From 29a7f5955952e31a20eb0044a97d85d7f45e5c40 Mon Sep 17 00:00:00 2001 From: chenuduss Date: Mon, 14 Sep 2026 17:12:36 +0300 Subject: [PATCH 2/9] acmp_prepare return value checks --- src/operators/pm.cc | 4 +++- src/operators/pm_from_file.cc | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/operators/pm.cc b/src/operators/pm.cc index 6a44b2860..b1404315d 100644 --- a/src/operators/pm.cc +++ b/src/operators/pm.cc @@ -176,7 +176,9 @@ bool Pm::init(const std::string &file, std::string *error) { }); while (m_p->is_failtree_done == 0) { - acmp_prepare(m_p); + if (acmp_prepare(m_p) != 1) { + return false; + } } return true; diff --git a/src/operators/pm_from_file.cc b/src/operators/pm_from_file.cc index 52651e95c..6ed6455db 100644 --- a/src/operators/pm_from_file.cc +++ b/src/operators/pm_from_file.cc @@ -81,7 +81,9 @@ bool PmFromFile::init(const std::string &config, std::string *error) { } while (m_p->is_failtree_done == 0) { - acmp_prepare(m_p); + if (acmp_prepare(m_p) != 1) { + return false; + } } return true; From d8aaef0dd791867e7617656ca37813cad1eb52d8 Mon Sep 17 00:00:00 2001 From: chenuduss Date: Tue, 15 Sep 2026 09:14:28 +0300 Subject: [PATCH 3/9] add return value for acmp_add_btree_leaves --- src/utils/acmp.cc | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/utils/acmp.cc b/src/utils/acmp.cc index 771da0283..468bd547d 100644 --- a/src/utils/acmp.cc +++ b/src/utils/acmp.cc @@ -163,13 +163,16 @@ static void acmp_connect_other_matches(ACMP *parser, acmp_node_t *node) { /** * Adds leaves to binary tree, working from sorted array of keyword tree nodes */ -static void acmp_add_btree_leaves(acmp_btree_node_t *node, acmp_node_t *nodes[], +static bool acmp_add_btree_leaves(acmp_btree_node_t *node, acmp_node_t *nodes[], int pos, int lb, int rb) { int left = 0, right = 0; if ((pos - lb) > 1) { left = lb + (pos - lb) / 2; node->left = reinterpret_cast(calloc(1, sizeof(acmp_btree_node_t))); + if (!(node->left)) { + return false; + } node->left->node = NULL; node->left->right = NULL; node->left->left = NULL; @@ -184,6 +187,9 @@ static void acmp_add_btree_leaves(acmp_btree_node_t *node, acmp_node_t *nodes[], if ((rb - pos) > 1) { right = pos + (rb - pos) / 2; node->right = reinterpret_cast(calloc(1, sizeof(acmp_btree_node_t))); + if (!(node->right)) { + return false; + } node->right->node = NULL; node->right->right = NULL; node->right->left = NULL; @@ -196,11 +202,17 @@ static void acmp_add_btree_leaves(acmp_btree_node_t *node, acmp_node_t *nodes[], #endif } if (node->right != NULL) { - acmp_add_btree_leaves(node->right, nodes, right, pos, rb); + if (!acmp_add_btree_leaves(node->right, nodes, right, pos, rb)){ + return false; + } } if (node->left != NULL) { - acmp_add_btree_leaves(node->left, nodes, left, lb, pos); + if (!acmp_add_btree_leaves(node->left, nodes, left, lb, pos)){ + return false; + } } + + return true; } /** @@ -250,7 +262,10 @@ static bool acmp_build_binary_tree(ACMP *parser, acmp_node_t *node) { pos = count / 2; node->btree->node = nodes[pos]; node->btree->letter = nodes[pos]->letter; - acmp_add_btree_leaves(node->btree, nodes, pos, -1, count); + if (!acmp_add_btree_leaves(node->btree, nodes, pos, -1, count)){ + free(nodes); + return false; + } for (i = 0; i < count; i++) { if (nodes[i]->child != NULL) if (!acmp_build_binary_tree(parser, nodes[i])) { From 4d1790844c06e4f4c4c22f0e82315f30f9ea885a Mon Sep 17 00:00:00 2001 From: chenuduss Date: Tue, 15 Sep 2026 11:19:47 +0300 Subject: [PATCH 4/9] acmp_btree_free function, alloc and dealloc logic in single file (acmp.cc) --- src/operators/pm.cc | 14 +------------- src/operators/pm.h | 1 - src/utils/acmp.cc | 13 ++++++++++++- src/utils/acmp.h | 6 ++++++ 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/operators/pm.cc b/src/operators/pm.cc index b1404315d..0dd826d64 100644 --- a/src/operators/pm.cc +++ b/src/operators/pm.cc @@ -111,7 +111,7 @@ void Pm::cleanup(acmp_node_t *n) { cleanup(n->sibling); cleanup(n->child); - postOrderTraversal(n->btree); + acmp_btree_free(n->btree); if (n->text && strlen(n->text) > 0) { free(n->text); @@ -127,18 +127,6 @@ void Pm::cleanup(acmp_node_t *n) { } -void Pm::postOrderTraversal(acmp_btree_node_t *node) { - if (node == NULL) { - return; - } - - postOrderTraversal(node->right); - postOrderTraversal(node->left); - - free(node); -} - - bool Pm::evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &input, RuleMessage &ruleMessage) { int rc; diff --git a/src/operators/pm.h b/src/operators/pm.h index 19e581fa6..b5e7ea420 100644 --- a/src/operators/pm.h +++ b/src/operators/pm.h @@ -51,7 +51,6 @@ 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: diff --git a/src/utils/acmp.cc b/src/utils/acmp.cc index 468bd547d..5fd4de46f 100644 --- a/src/utils/acmp.cc +++ b/src/utils/acmp.cc @@ -160,6 +160,17 @@ static void acmp_connect_other_matches(ACMP *parser, acmp_node_t *node) { } } +void acmp_btree_free(acmp_btree_node_t *node) { + if (node == NULL) { + return; + } + + acmp_btree_free(node->right); + acmp_btree_free(node->left); + + free(node); +} + /** * Adds leaves to binary tree, working from sorted array of keyword tree nodes */ @@ -250,7 +261,7 @@ static bool acmp_build_binary_tree(ACMP *parser, acmp_node_t *node) { } } if (node->btree != NULL) { - free(node->btree); + acmp_btree_free(node->btree); node->btree = NULL; } node->btree = reinterpret_cast(calloc(1, sizeof(acmp_btree_node_t))); diff --git a/src/utils/acmp.h b/src/utils/acmp.h index a93165fe5..0cfa6b1aa 100644 --- a/src/utils/acmp.h +++ b/src/utils/acmp.h @@ -190,6 +190,12 @@ int acmp_process_quick(ACMPT *acmpt, const char **match, const char *data, size_ */ int acmp_prepare(ACMP *parser); +/** + * Destroying the tree and freeing the memory. + */ +void acmp_btree_free(acmp_btree_node_t *node); + + } #endif /*ACMP_H_*/ From 8ec30c67e8d45879de8b02e3bab8f36e1e80a319 Mon Sep 17 00:00:00 2001 From: chenuduss Date: Tue, 15 Sep 2026 11:35:22 +0300 Subject: [PATCH 5/9] populating error for the higher-level logic --- src/operators/pm.cc | 1 + src/operators/pm_from_file.cc | 1 + 2 files changed, 2 insertions(+) diff --git a/src/operators/pm.cc b/src/operators/pm.cc index 0dd826d64..a09a3a139 100644 --- a/src/operators/pm.cc +++ b/src/operators/pm.cc @@ -165,6 +165,7 @@ bool Pm::init(const std::string &file, std::string *error) { while (m_p->is_failtree_done == 0) { if (acmp_prepare(m_p) != 1) { + error->assign("Failed to prepare pattern matcher."); return false; } } diff --git a/src/operators/pm_from_file.cc b/src/operators/pm_from_file.cc index 6ed6455db..0def9df23 100644 --- a/src/operators/pm_from_file.cc +++ b/src/operators/pm_from_file.cc @@ -82,6 +82,7 @@ bool PmFromFile::init(const std::string &config, std::string *error) { while (m_p->is_failtree_done == 0) { if (acmp_prepare(m_p) != 1) { + error->assign("Failed to prepare pattern matcher."); return false; } } From 5de262bdd7122a1b900329a553e5352c6887b674 Mon Sep 17 00:00:00 2001 From: chenuduss Date: Tue, 15 Sep 2026 11:48:33 +0300 Subject: [PATCH 6/9] pointer check --- src/operators/pm.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/operators/pm.cc b/src/operators/pm.cc index a09a3a139..df03a48c8 100644 --- a/src/operators/pm.cc +++ b/src/operators/pm.cc @@ -165,7 +165,7 @@ bool Pm::init(const std::string &file, std::string *error) { while (m_p->is_failtree_done == 0) { if (acmp_prepare(m_p) != 1) { - error->assign("Failed to prepare pattern matcher."); + if (error) error->assign("Failed to prepare pattern matcher."); return false; } } From e8ab63da54072b8356c68db134dd66f146303c45 Mon Sep 17 00:00:00 2001 From: chenuduss Date: Tue, 15 Sep 2026 12:17:42 +0300 Subject: [PATCH 7/9] code style --- src/utils/acmp.cc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/utils/acmp.cc b/src/utils/acmp.cc index 5fd4de46f..2dc3843eb 100644 --- a/src/utils/acmp.cc +++ b/src/utils/acmp.cc @@ -260,9 +260,9 @@ static bool acmp_build_binary_tree(ACMP *parser, acmp_node_t *node) { nodes[j] = tmp; } } - if (node->btree != NULL) { + if (node->btree != nullptr) { acmp_btree_free(node->btree); - node->btree = NULL; + node->btree = nullptr; } node->btree = reinterpret_cast(calloc(1, sizeof(acmp_btree_node_t))); if (!(node->btree)) { @@ -278,11 +278,12 @@ static bool acmp_build_binary_tree(ACMP *parser, acmp_node_t *node) { return false; } for (i = 0; i < count; i++) { - if (nodes[i]->child != NULL) + if (nodes[i]->child != nullptr) { if (!acmp_build_binary_tree(parser, nodes[i])) { free(nodes); return false; } + } } free(nodes); @@ -339,7 +340,7 @@ static int acmp_connect_fail_branches(ACMP *parser) { } acmp_connect_other_matches(parser, parser->root_node); - if (parser->root_node->child != NULL) { + if (parser->root_node->child != nullptr) { if (!acmp_build_binary_tree(parser, parser->root_node)) { return 0; } From b252404ca52ddb31dffd4c05f8087d332325c376 Mon Sep 17 00:00:00 2001 From: chenuduss Date: Tue, 15 Sep 2026 16:10:07 +0300 Subject: [PATCH 8/9] if statements code style --- src/utils/acmp.cc | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/utils/acmp.cc b/src/utils/acmp.cc index 2dc3843eb..0c203f16b 100644 --- a/src/utils/acmp.cc +++ b/src/utils/acmp.cc @@ -212,15 +212,11 @@ static bool acmp_add_btree_leaves(acmp_btree_node_t *node, acmp_node_t *nodes[], fprintf(stderr, "%lc ->right %lc\n", (wint_t)node->node->letter, (wint_t)node->right->node->letter); #endif } - if (node->right != NULL) { - if (!acmp_add_btree_leaves(node->right, nodes, right, pos, rb)){ - return false; - } + if ((node->right != NULL) && !acmp_add_btree_leaves(node->right, nodes, right, pos, rb)) { + return false; } - if (node->left != NULL) { - if (!acmp_add_btree_leaves(node->left, nodes, left, lb, pos)){ - return false; - } + if ((node->left != NULL) && !acmp_add_btree_leaves(node->left, nodes, left, lb, pos)) { + return false; } return true; @@ -278,11 +274,9 @@ static bool acmp_build_binary_tree(ACMP *parser, acmp_node_t *node) { return false; } for (i = 0; i < count; i++) { - if (nodes[i]->child != nullptr) { - if (!acmp_build_binary_tree(parser, nodes[i])) { - free(nodes); - return false; - } + if ((nodes[i]->child != nullptr) && !acmp_build_binary_tree(parser, nodes[i])) { + free(nodes); + return false; } } @@ -340,10 +334,8 @@ static int acmp_connect_fail_branches(ACMP *parser) { } acmp_connect_other_matches(parser, parser->root_node); - if (parser->root_node->child != nullptr) { - if (!acmp_build_binary_tree(parser, parser->root_node)) { - return 0; - } + if ((parser->root_node->child != nullptr) && !acmp_build_binary_tree(parser, parser->root_node)) { + return 0; } parser->is_failtree_done = 1; From 0be425a0ce7dc0eee01ee87a20238554dafc0387 Mon Sep 17 00:00:00 2001 From: chenuduss Date: Tue, 15 Sep 2026 16:20:20 +0300 Subject: [PATCH 9/9] code style --- src/utils/acmp.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/acmp.cc b/src/utils/acmp.cc index 0c203f16b..faf716874 100644 --- a/src/utils/acmp.cc +++ b/src/utils/acmp.cc @@ -212,10 +212,10 @@ static bool acmp_add_btree_leaves(acmp_btree_node_t *node, acmp_node_t *nodes[], fprintf(stderr, "%lc ->right %lc\n", (wint_t)node->node->letter, (wint_t)node->right->node->letter); #endif } - if ((node->right != NULL) && !acmp_add_btree_leaves(node->right, nodes, right, pos, rb)) { + if ((node->right != nullptr) && !acmp_add_btree_leaves(node->right, nodes, right, pos, rb)) { return false; } - if ((node->left != NULL) && !acmp_add_btree_leaves(node->left, nodes, left, lb, pos)) { + if ((node->left != nullptr) && !acmp_add_btree_leaves(node->left, nodes, left, lb, pos)) { return false; }