]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: init: stop disabled proxies after initializing fdtab
authorWilly Tarreau <w@1wt.eu>
Wed, 7 Oct 2020 16:36:54 +0000 (18:36 +0200)
committerWilly Tarreau <w@1wt.eu>
Fri, 9 Oct 2020 09:27:29 +0000 (11:27 +0200)
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.

src/cfgparse.c
src/haproxy.c

index cb48fef2b028ae1fd956c44d5b01eb01f061a223..a711ed842fc80ce9d6491b51b9067843c072faf9 100644 (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;
index eb4e9699a3b614fe89b3291236ab8f94c8e919ff..335ccb78ab8dd58cd62f8e3039f2852f96d6a61f 100644 (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);