From: Nick Porter Date: Fri, 19 Jul 2024 10:02:17 +0000 (+0100) Subject: Avoid mutex deadlock with rbtree_deletebydata X-Git-Tag: release_3_2_6~44 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=86393518bbdb9495cd4a6a32c692a910498773d4;p=thirdparty%2Ffreeradius-server.git Avoid mutex deadlock with rbtree_deletebydata --- diff --git a/src/lib/rbtree.c b/src/lib/rbtree.c index 835dc042931..cdf9f68e281 100644 --- a/src/lib/rbtree.c +++ b/src/lib/rbtree.c @@ -504,7 +504,6 @@ static rbnode_t *rbtree_find_internal(rbtree_t *tree, void const *data) int result = tree->compare(data, current->data); if (result == 0) { - PTHREAD_MUTEX_UNLOCK(tree); return current; } else { current = (result < 0) ? @@ -512,7 +511,6 @@ static rbnode_t *rbtree_find_internal(rbtree_t *tree, void const *data) } } - PTHREAD_MUTEX_UNLOCK(tree); return NULL; } @@ -536,13 +534,13 @@ bool rbtree_deletebydata(rbtree_t *tree, void const *data) rbnode_t *node; PTHREAD_MUTEX_LOCK(tree); - node = rbtree_find(tree, data); + node = rbtree_find_internal(tree, data); if (!node) { PTHREAD_MUTEX_UNLOCK(tree); return false; } - rbtree_delete_internal(tree, node, false); + rbtree_delete_internal(tree, node, true); PTHREAD_MUTEX_UNLOCK(tree); return true;