From: Alan T. DeKok Date: Thu, 23 Apr 2009 09:20:02 +0000 (+0200) Subject: Ensure we don't delete servers that are in use X-Git-Tag: release_2_1_7~193 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7268073b053ce1888c12ed42fb41caeff45d8e1d;p=thirdparty%2Ffreeradius-server.git Ensure we don't delete servers that are in use --- diff --git a/src/main/modules.c b/src/main/modules.c index 1a3ffe6fc74..f5382f43192 100644 --- a/src/main/modules.c +++ b/src/main/modules.c @@ -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; }