From 95409884a16c6a8d1dc34c8c7c5c9392e525cc2f Mon Sep 17 00:00:00 2001 From: Kartik Subbarao Date: Sat, 15 Oct 2022 22:13:54 -0400 Subject: [PATCH] Fix tree_insert() duplicate detection logic, resolves MarcJHuber/event-driven-servers#11 --- misc/rb.c | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/misc/rb.c b/misc/rb.c index a3cd320..777db49 100644 --- a/misc/rb.c +++ b/misc/rb.c @@ -182,32 +182,30 @@ static void right_rotate(rb_tree_t * T, rb_node_t * x) static int tree_insert(rb_tree_t * T, rb_node_t * z) { - rb_node_t *x, *y; - y = rb_nil; - x = T->root; - while (x != rb_nil) { - y = x; - if (T->compare(z->payload, x->payload) < 0) - x = x->left; - else - x = x->right; - } - z->parent = y; - if (y == rb_nil) - T->root = z; - else { - int i = T->compare(z->payload, y->payload); - if (i < 0) - y->left = z; - else if (i > 0) - y->right = z; - else { - return 0; /* Duplicate! */ + rb_node_t *x, *y; + y = rb_nil; + x = T->root; + while (x != rb_nil) { + y = x; + int i = T->compare(z->payload, x->payload); + if (i < 0) + x = x->left; + else if (i > 0) + x = x->right; + else { #ifdef DEBUG_RB - fprintf(stderr, "dupe! %p\n", z->payload); + fprintf(stderr, "dupe! %p\n", z->payload); #endif + return 0; /* Duplicate! */ + } } - } + z->parent = y; + if (y == rb_nil) + T->root = z; + else if (T->compare(z->payload, y->payload) < 0) + y->left = z; + else + y->right = z; z->prev = tree_predecessor(z); if (z->prev != rb_nil) { z->next = z->prev->next;