]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
every listener MUST have an "open" call
authorAlan T. DeKok <aland@freeradius.org>
Wed, 30 Apr 2025 17:30:08 +0000 (13:30 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 30 Apr 2025 17:30:08 +0000 (13:30 -0400)
as a development requirement

src/lib/server/virtual_servers.c

index f48b24c2004e106c56bc9952c4bbaa5700780536..968522a51b34a63a3f270505c1d7a528c7460076 100644 (file)
@@ -1543,12 +1543,15 @@ int virtual_servers_open(fr_schedule_t *sc)
                listener_cnt = talloc_array_length(listeners);
 
                for (j = 0; j < listener_cnt; j++) {                    
+                       int ret;
                        fr_virtual_listen_t *listener = listeners[j];
 
                        fr_assert(listener != NULL);
                        fr_assert(listener->proto_mi != NULL);
                        fr_assert(listener->proto_module != NULL);
 
+                       fr_assert(listener->proto_module->open != NULL);
+
                        /*
                         *      The socket is opened with app_instance,
                         *      but all subsequent calls (network.c, etc.) use app_io_instance.
@@ -1560,28 +1563,24 @@ int virtual_servers_open(fr_schedule_t *sc)
                         *      Even then, proto_radius usually calls fr_master_io_listen() in order
                         *      to create the fr_listen_t structure.
                         */
-                       if (listener->proto_module->open) {
-                               int ret;
-
-                               /*
-                                *      Sometimes the open function needs to modify instance
-                                *      data, so we need to temporarily remove the protection.
-                                */
-                               module_instance_data_unprotect(listener->proto_mi);
-                               ret = listener->proto_module->open(listener->proto_mi->data, sc,
-                                                                  listener->proto_mi->conf);
-                               module_instance_data_protect(listener->proto_mi);
-                               if (unlikely(ret < 0)) {
-                                       cf_log_err(listener->proto_mi->conf,
-                                                  "Opening %s I/O interface failed",
-                                                  listener->proto_module->common.name);
-
-                                       return -1;
-                               }
 
-                               opened++;
+                       /*
+                        *      Sometimes the open function needs to modify instance
+                        *      data, so we need to temporarily remove the protection.
+                        */
+                       module_instance_data_unprotect(listener->proto_mi);
+                       ret = listener->proto_module->open(listener->proto_mi->data, sc,
+                                                          listener->proto_mi->conf);
+                       module_instance_data_protect(listener->proto_mi);
+                       if (unlikely(ret < 0)) {
+                               cf_log_err(listener->proto_mi->conf,
+                                          "Failed opening listener %s",
+                                          listener->proto_module->common.name);                                
+                               return -1;
                        }
 
+                       opened++;
+
                        /*
                         *      Socket information is printed out by
                         *      the socket handlers.  e.g. proto_radius_udp