From: Arran Cudbard-Bell Date: Sat, 27 Feb 2021 01:04:30 +0000 (+0000) Subject: Lock critical trees in developer builds to expose iterator conflicts X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a902cc9f4d2ef1c5d104042be6ab7475e0a54f4e;p=thirdparty%2Ffreeradius-server.git Lock critical trees in developer builds to expose iterator conflicts --- diff --git a/src/lib/io/network.c b/src/lib/io/network.c index 2d2e8647f1d..3db18144b3a 100644 --- a/src/lib/io/network.c +++ b/src/lib/io/network.c @@ -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; diff --git a/src/lib/io/worker.c b/src/lib/io/worker.c index b1bb6bd1652..d0ed81cb5cf 100644 --- a/src/lib/io/worker.c +++ b/src/lib/io/worker.c @@ -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; diff --git a/src/lib/server/virtual_servers.c b/src/lib/server/virtual_servers.c index 1701a5b0c44..e3b01e75a1f 100644 --- a/src/lib/server/virtual_servers.c +++ b/src/lib/server/virtual_servers.c @@ -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; }