]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: server: segv when adding server with hostname from CLI
authorAurelien DARRAGON <adarragon@haproxy.com>
Fri, 16 Sep 2022 12:27:53 +0000 (14:27 +0200)
committerWilly Tarreau <w@1wt.eu>
Sat, 17 Sep 2022 04:30:59 +0000 (06:30 +0200)
When calling 'add server' with a hostname from the cli (runtime),
str2sa_range() does not resolve hostname because it is purposely
called without PA_O_RESOLVE flag.

This leads to 'srv->addr_node.key' being NULL. According to Willy it
is fine behavior, as long as we handle it properly, and is already
handled like this in srv_set_addr_desc().

This patch fixes GH #1865 by adding an extra check before inserting
'srv->addr_node' into 'be->used_server_addr'. Insertion and removal
will be skipped if 'addr_node.key' is NULL.

It must be backported to 2.6 and 2.5 only.

src/server.c

index debbd71e1f837ea43e40bca90a9108fd492d5fca..f35190d361f17f8580de222cd28a4aad152de34f 100644 (file)
@@ -4839,7 +4839,9 @@ static int cli_parse_add_server(char **args, char *payload, struct appctx *appct
        /* insert the server in the backend trees */
        eb32_insert(&be->conf.used_server_id, &srv->conf.id);
        ebis_insert(&be->conf.used_server_name, &srv->conf.name);
-       ebis_insert(&be->used_server_addr, &srv->addr_node);
+       /* addr_node.key could be NULL if FQDN resolution is postponed (ie: add server from cli) */
+       if (srv->addr_node.key)
+               ebis_insert(&be->used_server_addr, &srv->addr_node);
 
        thread_release();
 
@@ -5003,7 +5005,8 @@ static int cli_parse_delete_server(char **args, char *payload, struct appctx *ap
        /* remove srv from addr_node tree */
        eb32_delete(&srv->conf.id);
        ebpt_delete(&srv->conf.name);
-       ebpt_delete(&srv->addr_node);
+       if (srv->addr_node.key)
+               ebpt_delete(&srv->addr_node);
 
        /* remove srv from idle_node tree for idle conn cleanup */
        eb32_delete(&srv->idle_node);