mirror of
https://github.com/donl/rmilter.git
synced 2026-06-30 06:12:17 -06:00
* Fix memory allocating/deallocating in radix code
This commit is contained in:
parent
515d72d127
commit
9cb4b60e79
3 changed files with 44 additions and 19 deletions
|
|
@ -538,10 +538,10 @@ free_config (struct config_file *cfg)
|
|||
free (addr_cur);
|
||||
}
|
||||
|
||||
radix32tree_delete (cfg->grey_whitelist_tree, 0, 0);
|
||||
radix_tree_free (cfg->grey_whitelist_tree);
|
||||
free (cfg->grey_whitelist_tree);
|
||||
|
||||
radix32tree_delete (cfg->spamd_whitelist, 0, 0);
|
||||
radix_tree_free (cfg->spamd_whitelist);
|
||||
free (cfg->spamd_whitelist);
|
||||
|
||||
if (cfg->spamd_reject_message) {
|
||||
|
|
|
|||
56
radix.c
56
radix.c
|
|
@ -4,7 +4,6 @@
|
|||
|
||||
static void *radix_alloc(radix_tree_t *tree);
|
||||
|
||||
|
||||
radix_tree_t *
|
||||
radix_tree_create()
|
||||
{
|
||||
|
|
@ -15,7 +14,6 @@ radix_tree_create()
|
|||
return NULL;
|
||||
}
|
||||
|
||||
tree->start = NULL;
|
||||
tree->size = 0;
|
||||
|
||||
tree->root = radix_alloc(tree);
|
||||
|
|
@ -43,7 +41,7 @@ radix32tree_insert(radix_tree_t *tree, uint32_t key, uint32_t mask,
|
|||
|
||||
node = tree->root;
|
||||
next = tree->root;
|
||||
|
||||
/* Find a place in trie to insert */
|
||||
while (bit & mask) {
|
||||
if (key & bit) {
|
||||
next = node->right;
|
||||
|
|
@ -68,7 +66,7 @@ radix32tree_insert(radix_tree_t *tree, uint32_t key, uint32_t mask,
|
|||
node->value = value;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Inserting value in trie creating all path components */
|
||||
while (bit & mask) {
|
||||
next = radix_alloc(tree);
|
||||
if (next == NULL) {
|
||||
|
|
@ -195,22 +193,50 @@ radix_alloc(radix_tree_t *tree)
|
|||
{
|
||||
char *p;
|
||||
|
||||
if (tree->size < sizeof(radix_node_t)) {
|
||||
tree->start = malloc(sizeof(radix_node_t));
|
||||
if (tree->start == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
p = malloc(sizeof(radix_node_t));
|
||||
|
||||
tree->size = sizeof(radix_node_t);
|
||||
}
|
||||
|
||||
p = tree->start;
|
||||
tree->start += sizeof(radix_node_t);
|
||||
tree->size -= sizeof(radix_node_t);
|
||||
tree->size += sizeof(radix_node_t);
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
void
|
||||
radix_tree_free(radix_tree_t *tree)
|
||||
{
|
||||
radix_node_t *node, *tmp;
|
||||
|
||||
node = tree->root;
|
||||
|
||||
for (;;) {
|
||||
/* Traverse to the end of trie */
|
||||
while (node->left || node->right) {
|
||||
if (node->left) {
|
||||
node = node->left;
|
||||
}
|
||||
else {
|
||||
node = node->right;
|
||||
}
|
||||
}
|
||||
/* Found leaf node, free it */
|
||||
if (node->parent->right == node) {
|
||||
node->parent->right = NULL;
|
||||
|
||||
} else {
|
||||
node->parent->left = NULL;
|
||||
}
|
||||
|
||||
tmp = node;
|
||||
/* Go up */
|
||||
node = node->parent;
|
||||
free (tmp);
|
||||
|
||||
/* We are at the trie root and we have no more leaves, end of algorithm */
|
||||
if (!node->left && !node->right && !node->parent) {
|
||||
free (node);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
* vi:ts=4
|
||||
*/
|
||||
|
|
|
|||
3
radix.h
3
radix.h
|
|
@ -23,7 +23,6 @@ struct radix_node_s {
|
|||
|
||||
typedef struct {
|
||||
radix_node_t *root;
|
||||
char *start;
|
||||
size_t size;
|
||||
} radix_tree_t;
|
||||
|
||||
|
|
@ -34,6 +33,6 @@ int radix32tree_insert(radix_tree_t *tree,
|
|||
int radix32tree_delete(radix_tree_t *tree,
|
||||
uint32_t key, uint32_t mask);
|
||||
unsigned char radix32tree_find(radix_tree_t *tree, uint32_t key);
|
||||
|
||||
void radix_tree_free(radix_tree_t *tree);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue