]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Avoid mutex deadlock with rbtree_deletebydata
authorNick Porter <nick@portercomputing.co.uk>
Fri, 19 Jul 2024 10:02:17 +0000 (11:02 +0100)
committerNick Porter <nick@portercomputing.co.uk>
Fri, 19 Jul 2024 10:02:17 +0000 (11:02 +0100)
src/lib/rbtree.c

index 835dc04293154d82445d1a9cbcf5d8b70e4c7a05..cdf9f68e28186106e84838d79c7ca49fa683dbd2 100644 (file)
@@ -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;