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;
diff --git a/src/haproxy.c b/src/haproxy.c
index eb4e969..335ccb7 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -2338,6 +2338,12 @@
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);