]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
control sockets don't have dictionaries
authorAlan T. DeKok <aland@freeradius.org>
Tue, 23 Feb 2021 15:30:05 +0000 (10:30 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 23 Feb 2021 15:30:05 +0000 (10:30 -0500)
src/lib/server/virtual_servers.c

index e46f150fe3174327db530a83c0c680a548314382..6b52649544203819a8d24f4c064e10e5807e94a1 100644 (file)
@@ -697,12 +697,13 @@ int virtual_servers_instantiate(void)
                CONF_ITEM               *ci = NULL;
                CONF_SECTION            *server_cs = virtual_servers[i]->server_cs;
                CONF_DATA const         *cd;
-               virtual_server_dict_t   *dict;
+               virtual_server_dict_t   *dict = NULL;
 
                cd = cf_data_find(server_cs, virtual_server_dict_t, "dictionary");
-               fr_assert(cd != NULL);
-               dict = (virtual_server_dict_t *) cf_data_value(cd);
-               fr_assert(dict != NULL);
+               if (cd) {       /* only NULl for the control socket */
+                       dict = (virtual_server_dict_t *) cf_data_value(cd);
+                       fr_assert(dict != NULL);
+               }
 
                listener = virtual_servers[i]->listener;
                listen_cnt = talloc_array_length(listener);
@@ -722,7 +723,7 @@ int virtual_servers_instantiate(void)
 
                        found = rbtree_finddata(vns_tree, &find);
                        if (found) {
-                               fr_assert(dict->dict == found->dict);
+                               fr_assert(dict && (dict->dict == found->dict));
 
                                if (found->func(server_cs) < 0) return -1;
                        }
@@ -902,7 +903,12 @@ int virtual_servers_bootstrap(CONF_SECTION *config)
 
                server_cs = virtual_servers[i]->server_cs;
 
-               fr_assert(cf_data_find(server_cs, virtual_server_dict_t, "dictionary") != NULL);
+               /*
+                *      The only listener which can't have a dictionary is "control".
+                */
+               fr_assert((cf_data_find(server_cs, virtual_server_dict_t, "dictionary") != NULL) ||
+                         (virtual_servers[i]->listener &&
+                          (strcmp(((fr_virtual_listen_t *) virtual_servers[i]->listener[0])->proto_module->module->common->name, "control") == 0)));
 
                if (!virtual_servers[i]->listener) goto bootstrap;