aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--radix-trie.c25
1 files changed, 11 insertions, 14 deletions
diff --git a/radix-trie.c b/radix-trie.c
index fb39047..fbbfea2 100644
--- a/radix-trie.c
+++ b/radix-trie.c
@@ -288,16 +288,15 @@ static int add(struct radix_node **trie, uint8_t bits, const uint8_t *key,
static void radix_free_nodes(struct radix_node *node)
{
- struct radix_node *old, *bottom = node;
-
- while (node) {
- while (bottom->bit[0])
- bottom = bottom->bit[0];
- bottom->bit[0] = node->bit[1];
-
- old = node;
- node = node->bit[0];
- free(old);
+ for (struct radix_node *next; node; node = next) {
+ next = node->bit[0];
+ if (next) {
+ node->bit[0] = next->bit[1];
+ next->bit[1] = node;
+ } else {
+ next = node->bit[1];
+ free(node);
+ }
}
}
@@ -467,16 +466,14 @@ void ipp_free(struct ip_pool *pool)
radix_free_nodes(pool->ip4_root);
radix_free_nodes(pool->ip6_root);
- for (struct radix_pool *cur = pool->ip4_pool; cur; cur = cur->next) {
+ for (struct radix_pool *cur = pool->ip4_pool; cur; cur = next) {
next = cur->next;
free(cur);
- cur = next;
}
- for (struct radix_pool *cur = pool->ip6_pool; cur; cur = cur->next) {
+ for (struct radix_pool *cur = pool->ip6_pool; cur; cur = next) {
next = cur->next;
free(cur);
- cur = next;
}
}