]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
various bug fixes in proto_detail
authorAlan T. DeKok <aland@freeradius.org>
Sat, 21 Feb 2026 00:55:34 +0000 (19:55 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Sat, 21 Feb 2026 12:41:15 +0000 (07:41 -0500)
src/listen/detail/proto_detail.c
src/listen/detail/proto_detail_file.c
src/listen/detail/proto_detail_work.c

index 32f3ef88134ee52c042ec7d6f6985b5f3fd255f9..8bd4c7845b52b6cd998609b949b419b4f52a6b0c 100644 (file)
@@ -120,8 +120,6 @@ static int type_parse(UNUSED TALLOC_CTX *ctx, void *out, void *parent, CONF_ITEM
        CONF_PAIR               *cp = cf_item_to_pair(ci);
        char const              *value = cf_pair_value(cp);
 
-       *((char const **) out) = value;
-
        inst->dict = virtual_server_dict_by_child_ci(ci);
        if (!inst->dict) {
                cf_log_err(ci, "Please define 'namespace' in this virtual server");
@@ -146,6 +144,8 @@ static int type_parse(UNUSED TALLOC_CTX *ctx, void *out, void *parent, CONF_ITEM
        }
 
        inst->code = type_enum->value->vb_uint32;
+       *((char const **) out) = value;
+
        return 0;
 }
 
index aeb23b0338e11cad24d047394f0665823e4eb7ea..2e76858a6e9ab10a42415e3966135bf14a21e5a9 100644 (file)
@@ -360,6 +360,7 @@ static int work_exists(proto_detail_file_thread_t *thread, int fd)
        if (fr_event_filter_insert(thread, NULL, thread->el, fd, FR_EVENT_FILTER_VNODE,
                                   &funcs, NULL, thread) < 0) {
                PERROR("Failed adding work socket to event loop");
+               close(li->fd);
                close(fd);
                talloc_free(li);
                return -1;
@@ -384,10 +385,6 @@ static int work_exists(proto_detail_file_thread_t *thread, int fd)
        li->default_message_size = inst->parent->max_packet_size;
        li->num_messages = inst->parent->num_messages;
 
-       pthread_mutex_lock(&thread->worker_mutex);
-       thread->num_workers++;
-       pthread_mutex_unlock(&thread->worker_mutex);
-
        /*
         *      Open the detail.work file.
         */
@@ -423,6 +420,10 @@ static int work_exists(proto_detail_file_thread_t *thread, int fd)
         */
        work->listen = li;
 
+       pthread_mutex_lock(&thread->worker_mutex);
+       thread->num_workers++;
+       pthread_mutex_unlock(&thread->worker_mutex);
+
        return 0;
 }
 
@@ -772,10 +773,10 @@ static int mod_close(fr_listen_t *li)
                }
                close(thread->vnode_fd);
                thread->vnode_fd = -1;
-
-               pthread_mutex_destroy(&thread->worker_mutex);
        }
 
+       pthread_mutex_destroy(&thread->worker_mutex);
+
        return 0;
 }
 
index 96b88ae3225bdd93ec093a9d87aa61aa7767fe77..e7cd446796f0b4177cf57329abfdeef52e32d5a2 100644 (file)
@@ -449,6 +449,7 @@ redo:
                }
 
                fr_assert(*leftover == 0);
+               packet_len = 0;
                goto done;
        }
 
@@ -503,6 +504,8 @@ redo:
        *packet_ctx = track;
        *recv_time_p = track->timestamp;
 
+       thread->outstanding++;
+
 done:
        /*
         *      If we're at EOF, mark us as "closing".
@@ -513,8 +516,6 @@ done:
                MPRINT("AT EOF, BUT CLOSING %d", thread->closing);
        }
 
-       thread->outstanding++;
-
        /*
         *      Pause reading until such time as we need more packets.
         */
@@ -870,14 +871,13 @@ static int mod_instantiate(module_inst_ctx_t const *mctx)
 
        FR_INTEGER_BOUND_CHECK("limit.max_outstanding", inst->max_outstanding, >=, 1);
 
-       client = inst->client = talloc_zero(inst, fr_client_t);
-       if (!inst->client) return 0;
+       MEM(client = inst->client = talloc_zero(inst, fr_client_t));
 
        client->ipaddr.af = AF_INET;
        client->ipaddr.addr.v4.s_addr = htonl(INADDR_NONE);
        client->src_ipaddr = client->ipaddr;
 
-       client->longname = client->shortname = client->secret = inst->filename;
+       client->longname = client->shortname = client->secret = inst->filename_work;
        client->nas_type = talloc_strdup(client, "other");
 
        return 0;