Ensure we don't delete servers that are in use
authorAlan T. DeKok <aland@freeradius.org>
Thu, 23 Apr 2009 09:20:02 +0000 (11:20 +0200)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 23 Apr 2009 09:20:02 +0000 (11:20 +0200)
src/main/modules.c

index 1a3ffe6..f5382f4 100644 (file)
@@ -41,6 +41,7 @@ typedef struct indexed_modcallable {
 typedef struct virtual_server_t {
        const char      *name;
        time_t          created;
+       int             can_free;
        CONF_SECTION    *cs;
        rbtree_t        *components;
        struct virtual_server_t *next;
@@ -176,12 +177,15 @@ void virtual_servers_free(time_t when)
 
                        /*
                         *      If we delete it, fix the links so that
-                        *      we don't orphan anything.
+                        *      we don't orphan anything.  Also,
+                        *      delete it if it's old, AND a newer one
+                        *      was defined.
                         *
                         *      Otherwise, the last pointer gets set to
                         *      the one we didn't delete.
                         */
-                       if ((when == 0) || (server->created < when)) {
+                       if ((when == 0) ||
+                           ((server->created < when) && server->can_free)) {
                                *last = server->next;
                                virtual_server_free(server);
                        } else {
@@ -1034,6 +1038,18 @@ static int load_byserver(CONF_SECTION *cs)
        server->next = virtual_servers[comp];
        virtual_servers[comp] = server;
 
+       /*
+        *      Mark OLDER ones of the same name as being unused.
+        */
+       server = server->next;
+       while (server) {
+               if (strcmp(server->name, name) == 0) {
+                       server->can_free = TRUE;
+                       break;
+               }
+               server = server->next;
+       }
+
        return 0;
 }