From f7472c90607f737843ec644a8b3fca4cf1829883 Mon Sep 17 00:00:00 2001 From: chenuduss Date: Wed, 16 Sep 2026 10:25:37 +0300 Subject: [PATCH 1/6] CPTFreePrefix() as a companion to the CPTCreatePrefix() function, and correct freeing of pointers --- src/utils/ip_tree.cc | 10 +--------- src/utils/msc_tree.cc | 15 +++++++++++++-- src/utils/msc_tree.h | 1 + 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/utils/ip_tree.cc b/src/utils/ip_tree.cc index 124bc47f30..54cc99e019 100644 --- a/src/utils/ip_tree.cc +++ b/src/utils/ip_tree.cc @@ -47,15 +47,7 @@ void IpTree::postOrderTraversal(TreeNode *node) { node->netmasks = NULL; } if (node->prefix) { - if (node->prefix->buffer) { - free(node->prefix->buffer); - node->prefix->buffer = NULL; - } - if (node->prefix->prefix_data) { - free(node->prefix->prefix_data); - node->prefix->prefix_data = NULL; - } - free(node->prefix); + CPTFreePrefix(node->prefix); node->prefix = NULL; } free(node); diff --git a/src/utils/msc_tree.cc b/src/utils/msc_tree.cc index ea6c1a4167..0fca09310c 100644 --- a/src/utils/msc_tree.cc +++ b/src/utils/msc_tree.cc @@ -109,6 +109,16 @@ TreePrefix *InsertDataPrefix(TreePrefix *prefix, unsigned char *ipdata, unsigned return prefix; } +void CPTFreePrefix(TreePrefix *prefix) { + if (prefix->buffer) { + free(prefix->buffer); + } + if (prefix->prefix_data) { + free(prefix->prefix_data); + } + free(prefix); +} + TreePrefix *CPTCreatePrefix(unsigned char *ipdata, unsigned int ip_bitmask, unsigned char netmask) { @@ -444,6 +454,7 @@ TreeNode *CPTAddElement(unsigned char *ipdata, unsigned int ip_bitmask, CPTTree node->prefix = CPTCreatePrefix(prefix->buffer, prefix->bitlen, NETMASK_256-1); } + CPTFreePrefix(prefix); return node; } @@ -472,7 +483,7 @@ TreeNode *CPTAddElement(unsigned char *ipdata, unsigned int ip_bitmask, CPTTree i_node = CPTCreateNode(); if (i_node == NULL) { - free(new_node->prefix); + CPTFreePrefix(new_node->prefix); free(new_node); return NULL; } @@ -494,7 +505,7 @@ TreeNode *CPTAddElement(unsigned char *ipdata, unsigned int ip_bitmask, CPTTree memset(i_node->netmasks, 0, ((node->count - i) * sizeof(unsigned char))); if(i_node->netmasks == NULL) { - free(new_node->prefix); + CPTFreePrefix(new_node->prefix); free(new_node); free(i_node); return NULL; diff --git a/src/utils/msc_tree.h b/src/utils/msc_tree.h index 30f8d43326..088f30cf47 100644 --- a/src/utils/msc_tree.h +++ b/src/utils/msc_tree.h @@ -85,6 +85,7 @@ struct TreeRoot { CPTTree *ipv6_tree; }; +void CPTFreePrefix(TreePrefix *prefix); CPTTree *CPTCreateRadixTree(); TreeNode *CPTIpMatch(unsigned char *ipdata, CPTTree *tree, int type); TreeNode *TreeAddIP(const char *buffer, CPTTree *tree, int type); From e16bb2bbb8b57eafdaff278d1879cad3d594b1bd Mon Sep 17 00:00:00 2001 From: chenuduss Date: Wed, 16 Sep 2026 11:04:13 +0300 Subject: [PATCH 2/6] CPTFreePrefix: TreePrefix prefix_data deallocation sequence fix --- src/utils/msc_tree.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/utils/msc_tree.cc b/src/utils/msc_tree.cc index 0fca09310c..e33560182f 100644 --- a/src/utils/msc_tree.cc +++ b/src/utils/msc_tree.cc @@ -113,9 +113,13 @@ void CPTFreePrefix(TreePrefix *prefix) { if (prefix->buffer) { free(prefix->buffer); } - if (prefix->prefix_data) { - free(prefix->prefix_data); + + while (prefix->prefix_data) { + CPTData *tmp = prefix->prefix_data; + prefix->prefix_data = tmp->next; + free(tmp); } + free(prefix); } From 35d1051e8f9078689174afe697c17be2742e0cd5 Mon Sep 17 00:00:00 2001 From: chenuduss Date: Fri, 18 Sep 2026 12:02:57 +0300 Subject: [PATCH 3/6] InsertDataPrefix refactoring and optimization, fix memory leaks --- src/utils/msc_tree.cc | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/utils/msc_tree.cc b/src/utils/msc_tree.cc index e33560182f..75dde51fbe 100644 --- a/src/utils/msc_tree.cc +++ b/src/utils/msc_tree.cc @@ -92,21 +92,15 @@ CPTData *CPTCreateCPTData(unsigned char netmask) { return prefix_data; } -TreePrefix *InsertDataPrefix(TreePrefix *prefix, unsigned char *ipdata, unsigned int ip_bitmask, +static bool InsertDataPrefix(TreePrefix *prefix, unsigned char *ipdata, unsigned int ip_bitmask, unsigned char netmask) { - if(prefix == NULL) - return NULL; - memcpy(prefix->buffer, ipdata, ip_bitmask/8); prefix->bitlen = ip_bitmask; prefix->prefix_data = CPTCreateCPTData(netmask); - if(prefix->prefix_data == NULL) - return NULL; - - return prefix; + return prefix->prefix_data != nullptr; } void CPTFreePrefix(TreePrefix *prefix) { @@ -148,7 +142,13 @@ TreePrefix *CPTCreatePrefix(unsigned char *ipdata, unsigned int ip_bitmask, memset(prefix->buffer, 0, bytes); - return InsertDataPrefix(prefix, ipdata, ip_bitmask, netmask); + if (!InsertDataPrefix(prefix, ipdata, ip_bitmask, netmask)){ + CPTFreePrefix(prefix); + prefix = nullptr; + } + + return prefix; + } void CPTAppendToCPTDataList(CPTData *n, CPTData **list) { @@ -421,8 +421,10 @@ TreeNode *CPTAddElement(unsigned char *ipdata, unsigned int ip_bitmask, CPTTree CPTData *prefix_data = CPTCreateCPTData(netmask); CPTAppendToCPTDataList(prefix_data, &prefix->prefix_data); - if(CheckBitmask(netmask, ip_bitmask)) + if(CheckBitmask(netmask, ip_bitmask)) { + CPTFreePrefix(prefix); return node; + } parent = node->parent; while (parent != NULL && netmask < (parent->bit + 1)) { @@ -437,6 +439,7 @@ TreeNode *CPTAddElement(unsigned char *ipdata, unsigned int ip_bitmask, CPTTree if ((node->count -1) == 0) { node->netmasks[0] = netmask; + CPTFreePrefix(prefix); return new_node; } From 6039edb5ae50b163d36d27a9d8ee8da33812dd9e Mon Sep 17 00:00:00 2001 From: chenuduss Date: Fri, 18 Sep 2026 14:45:11 +0300 Subject: [PATCH 4/6] CPTCreateHead refactoring, correction fail handling in CPTAddElement --- src/utils/msc_tree.cc | 49 ++++++++++++++----------------------------- 1 file changed, 16 insertions(+), 33 deletions(-) diff --git a/src/utils/msc_tree.cc b/src/utils/msc_tree.cc index 75dde51fbe..766a6aa9cb 100644 --- a/src/utils/msc_tree.cc +++ b/src/utils/msc_tree.cc @@ -220,36 +220,16 @@ int CheckBitmask(unsigned char netmask, unsigned int ip_bitmask) { return 0; } -TreeNode *CPTCreateHead(TreePrefix *prefix, TreeNode *node, CPTTree *tree, unsigned char netmask, unsigned int ip_bitmask) { - - if(tree == NULL) - return NULL; - - if(prefix == NULL) - return NULL; - - if (node != NULL) { - - node->prefix = prefix; - node->bit = prefix->bitlen; - tree->head = node; - - if(CheckBitmask(netmask, ip_bitmask)) - return node; - - node->count++; - node->netmasks = reinterpret_cast(malloc(node->count * sizeof(unsigned char))); - - if(node->netmasks) - node->netmasks[0] = netmask; - - return node; - - } else { - return NULL; - } - - return NULL; +static void CPTCreateHead(TreePrefix *prefix, TreeNode *node, CPTTree *tree, unsigned char netmask, unsigned int ip_bitmask) { + node->prefix = prefix; + node->bit = prefix->bitlen; + tree->head = node; + if(CheckBitmask(netmask, ip_bitmask)) + return ; + node->count++; + node->netmasks = reinterpret_cast(malloc(node->count * sizeof(unsigned char))); + if(node->netmasks) + node->netmasks[0] = netmask; } TreeNode *SetParentNode(TreeNode *node, TreeNode *new_node, CPTTree *tree) { @@ -334,7 +314,8 @@ TreeNode *CPTAddElement(unsigned char *ipdata, unsigned int ip_bitmask, CPTTree if (tree->head == NULL) { node = CPTCreateNode(); - return CPTCreateHead(prefix, node, tree, netmask, ip_bitmask); + CPTCreateHead(prefix, node, tree, netmask, ip_bitmask); + return node; } node = tree->head; @@ -467,8 +448,10 @@ TreeNode *CPTAddElement(unsigned char *ipdata, unsigned int ip_bitmask, CPTTree new_node = CPTCreateNode(); - if(new_node == NULL) - return NULL; + if(new_node == nullptr) { + CPTFreePrefix(prefix); + return nullptr; + } new_node->prefix = prefix; new_node->bit = prefix->bitlen; From cde09917e7e84faa7ad408615bdac45b0850cf1d Mon Sep 17 00:00:00 2001 From: chenuduss Date: Fri, 18 Sep 2026 15:03:49 +0300 Subject: [PATCH 5/6] handing result of CPTCreateNode --- src/utils/msc_tree.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/utils/msc_tree.cc b/src/utils/msc_tree.cc index 766a6aa9cb..6e2a4dcfe6 100644 --- a/src/utils/msc_tree.cc +++ b/src/utils/msc_tree.cc @@ -65,7 +65,7 @@ void ConvertIPNetmask(unsigned char *buffer, unsigned char netmask, unsigned int return; } -TreeNode *CPTCreateNode() { +static TreeNode *CPTCreateNode() { TreeNode *node; node = reinterpret_cast(malloc(sizeof(TreeNode))); @@ -314,7 +314,11 @@ TreeNode *CPTAddElement(unsigned char *ipdata, unsigned int ip_bitmask, CPTTree if (tree->head == NULL) { node = CPTCreateNode(); - CPTCreateHead(prefix, node, tree, netmask, ip_bitmask); + if (node) { + CPTCreateHead(prefix, node, tree, netmask, ip_bitmask); + } else { + CPTFreePrefix(prefix); + } return node; } From c3eac0a0d3d6bd59516c5062b9d695241f4791af Mon Sep 17 00:00:00 2001 From: chenuduss Date: Fri, 18 Sep 2026 15:46:51 +0300 Subject: [PATCH 6/6] remove NULL mnemonic --- src/utils/msc_tree.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/utils/msc_tree.cc b/src/utils/msc_tree.cc index 6e2a4dcfe6..0b8c4b8197 100644 --- a/src/utils/msc_tree.cc +++ b/src/utils/msc_tree.cc @@ -70,10 +70,9 @@ static TreeNode *CPTCreateNode() { node = reinterpret_cast(malloc(sizeof(TreeNode))); - if(node == NULL) - return NULL; + if(node) + memset(node, 0, sizeof(TreeNode)); - memset(node, 0, sizeof(TreeNode)); return node; }