]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Lock critical trees in developer builds to expose iterator conflicts
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sat, 27 Feb 2021 01:04:30 +0000 (01:04 +0000)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sat, 27 Feb 2021 01:04:42 +0000 (01:04 +0000)
src/lib/io/network.c
src/lib/io/worker.c
src/lib/server/virtual_servers.c

index 2d2e8647f1df18ea0bd80c24d6d5442cc0a4497c..3db18144b3a92f5ae95c7ea358766a06944f3c28 100644 (file)
@@ -1584,6 +1584,12 @@ fr_network_t *fr_network_create(TALLOC_CTX *ctx, fr_event_list_t *el, char const
 {
        fr_network_t *nr;
 
+#ifndef NDEBUG
+       int rbflags = RBTREE_FLAG_LOCK; /* Produces deadlocks when iterators conflict with other operations */
+#else
+       int rbflags = RBTREE_FLAG_NONE;
+#endif
+
        nr = talloc_zero(ctx, fr_network_t);
        if (!nr) {
                fr_strerror_const("Failed allocating memory");
@@ -1657,13 +1663,13 @@ fr_network_t *fr_network_create(TALLOC_CTX *ctx, fr_event_list_t *el, char const
        /*
         *      Create the various heaps.
         */
-       nr->sockets = rbtree_talloc_alloc(nr, fr_network_socket_t, listen_node, socket_listen_cmp, NULL, RBTREE_FLAG_NONE);
+       nr->sockets = rbtree_talloc_alloc(nr, fr_network_socket_t, listen_node, socket_listen_cmp, NULL, rbflags);
        if (!nr->sockets) {
                fr_strerror_const_push("Failed creating listen tree for sockets");
                goto fail2;
        }
 
-       nr->sockets_by_num = rbtree_talloc_alloc(nr, fr_network_socket_t, num_node, socket_num_cmp, NULL, RBTREE_FLAG_NONE);
+       nr->sockets_by_num = rbtree_talloc_alloc(nr, fr_network_socket_t, num_node, socket_num_cmp, NULL, rbflags);
        if (!nr->sockets_by_num) {
                fr_strerror_const_push("Failed creating number tree for sockets");
                goto fail2;
index b1bb6bd16523ecf95f3c78be5ee4612e29328673..d0ed81cb5cfbb768f7a6663525fdcdc8df4671a9 100644 (file)
@@ -1061,6 +1061,12 @@ fr_worker_t *fr_worker_create(TALLOC_CTX *ctx, fr_event_list_t *el, char const *
 {
        fr_worker_t *worker;
 
+#ifndef NDEBUG
+       int rbflags = RBTREE_FLAG_LOCK; /* Produces deadlocks when iterators conflict with other operations */
+#else
+       int rbflags = RBTREE_FLAG_NONE;
+#endif
+
        worker = talloc_zero(ctx, fr_worker_t);
        if (!worker) {
 nomem:
@@ -1134,7 +1140,7 @@ nomem:
                goto fail;
        }
 
-       worker->dedup = rbtree_talloc_alloc(worker, request_t, dedup_node, worker_dedup_cmp, NULL, RBTREE_FLAG_NONE);
+       worker->dedup = rbtree_talloc_alloc(worker, request_t, dedup_node, worker_dedup_cmp, NULL, rbflags);
        if (!worker->dedup) {
                fr_strerror_const("Failed creating de_dup tree");
                goto fail;
index 1701a5b0c442ddb42e9adfd0987a9b6752e0da46..e3b01e75a1f52bc021504f2268ecd552ac914d02 100644 (file)
@@ -1225,6 +1225,12 @@ int virtual_server_has_namespace(CONF_SECTION **out,
 
 int virtual_servers_init(CONF_SECTION *config)
 {
+#ifndef NDEBUG
+       int rbflags = RBTREE_FLAG_LOCK; /* Produces deadlocks when iterators conflict with other operations */
+#else
+       int rbflags = RBTREE_FLAG_NONE;
+#endif
+
        virtual_server_root = config;
 
        if (fr_dict_autoload(virtual_server_dict) < 0) {
@@ -1238,9 +1244,9 @@ int virtual_servers_init(CONF_SECTION *config)
        }
 
        MEM(listen_addr_root = rbtree_alloc(NULL, fr_listen_t, virtual_server_node,
-                                           listen_addr_cmp, NULL, RBTREE_FLAG_NONE));
+                                           listen_addr_cmp, NULL, rbflags));
        MEM(server_section_name_tree = rbtree_alloc(NULL, virtual_server_compile_t, node,
-                                                   server_section_name_cmp, NULL, RBTREE_FLAG_NONE));
+                                                   server_section_name_cmp, NULL, rbflags));
 
        return 0;
 }