]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: server: do not keep an invalid dynamic server in px ids tree
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Tue, 8 Jun 2021 15:00:20 +0000 (17:00 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Tue, 15 Jun 2021 09:42:53 +0000 (11:42 +0200)
A bug is present when trying to create a dynamic server with a fixed id.
If the server is detected invalid due to a later parsing arguments
error, the server is not removed from the proxy used ids tree before
being freed.

Change the mode of operation of 'id' keyword parsing handler. The
insertion in the backend tree is removed from the handler and is not
taken in charge by parse_server for configuration parsing. For the
dynamic servers, the insertion is called at the end of the 'add server'
CLI handler when the server has been validated.

This must be backported up to 2.4.

src/server.c

index ec4eab65d6eae2aca46d1e46613562ccdff71ab1..05c5de1abe164f922d72d4cd3f5f3289f14e2df3 100644 (file)
@@ -610,7 +610,6 @@ static int srv_parse_id(char **args, int *cur_arg, struct proxy *curproxy, struc
                return ERR_ALERT | ERR_FATAL;
        }
 
-       eb32_insert(&curproxy->conf.used_server_id, &newsrv->conf.id);
        newsrv->flags |= SRV_F_FORCED_ID;
        return 0;
 }
@@ -2715,6 +2714,15 @@ int parse_server(const char *file, int linenum, char **args,
        if (parse_flags & SRV_PARSE_TEMPLATE)
                _srv_parse_tmpl_init(newsrv, curproxy);
 
+       /* If the server id is fixed, insert it in the proxy used_id tree.
+        * This is needed to detect a later duplicate id via srv_parse_id.
+        *
+        * If no is specified, a dynamic one is generated in
+        * check_config_validity.
+        */
+       if (newsrv->flags & SRV_F_FORCED_ID)
+               eb32_insert(&curproxy->conf.used_server_id, &newsrv->conf.id);
+
        HA_DIAG_WARNING_COND((curproxy->cap & PR_CAP_LB) && !newsrv->uweight,
                             "configured with weight of 0 will never be selected by load balancing algorithms\n");
 
@@ -4464,10 +4472,8 @@ static int cli_parse_add_server(char **args, char *payload, struct appctx *appct
        }
 
        /* insert the server in the backend trees */
-       if (!(srv->flags & SRV_F_FORCED_ID)) {
-               eb32_insert(&be->conf.used_server_id, &srv->conf.id);
-               ebis_insert(&be->conf.used_server_name, &srv->conf.name);
-       }
+       eb32_insert(&be->conf.used_server_id, &srv->conf.id);
+       ebis_insert(&be->conf.used_server_name, &srv->conf.name);
 
        thread_release();