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.
diff --git a/src/cfgparse.c b/src/cfgparse.c
index cb48fef..a711ed8 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -2235,10 +2235,13 @@
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;