MEDIUM: init: stop disabled proxies after initializing fdtab

During the startup process we don't have any fdtab nor fd_updt for quite
a long time, and as such some operations on the listeners are not
permitted, such as fd_want_*/fd_stop_* or fd_delete(). The latter is of
particular concern because it's used when stopping a disabled frontend,
and it's performed very early during check_config_validity() while there
is no fdtab yet. The trick till now relies on the listener's state which
is a bit brittle.

There is absolutely no valid reason for stopping a proxy's listeners this
early, we can postpone it after init_pollers() which will at least have
allocated fdtab.
This commit is contained in:
Willy Tarreau 2020-10-07 18:36:54 +02:00
parent cb89e32f31
commit 02b092f006
2 changed files with 11 additions and 2 deletions

View File

@ -2235,10 +2235,13 @@ int check_config_validity()
if (curproxy->state == PR_STSTOPPED) {
/* ensure we don't keep listeners uselessly bound */
stop_proxy(curproxy);
/* ensure we don't keep listeners uselessly bound. We
* can't disable their listeners yet (fdtab not
* allocated yet) but let's skip them.
*/
if (curproxy->table) {
free((void *)curproxy->table->peers.name);
curproxy->table->peers.name = NULL;
curproxy->table->peers.p = NULL;
}
continue;

View File

@ -2338,6 +2338,12 @@ static void init(int argc, char **argv)
if (!global.node)
global.node = strdup(hostname);
/* stop disabled proxies */
for (px = proxies_list; px; px = px->next) {
if (px->state == PR_STSTOPPED)
stop_proxy(px);
}
if (!hlua_post_init())
exit(1);