BUG/MEDIUM: server: srv_set_addr_desc() crashes when a server has no address

GitHub Issue #1026 reported a crash during configuration check for the
following example config:

    backend 0
    server 0 0
    server 0 0

HAProxy crashed in srv_set_addr_desc() due to a NULL pointer dereference
caused by `sa2str` returning NULL for an `AF_UNSPEC` address (`0`).

Check to make sure the address key is non-null before using it for
comparison or inserting it into the tree.

The crash was introduced in commit 92149f9a8 ("MEDIUM: stick-tables: Add
srvkey option to stick-table") which not in any released version so no
backport is needed.

Cc: Tim Duesterhus <tim@bastelstu.be>
This commit is contained in:
Thayne McCombs 2021-01-05 23:10:09 -07:00 committed by Willy Tarreau
parent 1ab76dd956
commit 24da7e1aa6

View File

@ -204,7 +204,7 @@ static void srv_set_addr_desc(struct server *s)
key = sa2str(&s->addr, s->svc_port, s->flags & SRV_F_MAPPORTS); key = sa2str(&s->addr, s->svc_port, s->flags & SRV_F_MAPPORTS);
if (s->addr_node.key) { if (s->addr_node.key) {
if (strcmp(key, s->addr_node.key) == 0) { if (key && strcmp(key, s->addr_node.key) == 0) {
free(key); free(key);
return; return;
} }
@ -218,9 +218,11 @@ static void srv_set_addr_desc(struct server *s)
s->addr_node.key = key; s->addr_node.key = key;
HA_RWLOCK_WRLOCK(PROXY_LOCK, &p->lock); if (s->addr_node.key) {
ebis_insert(&p->used_server_addr, &s->addr_node); HA_RWLOCK_WRLOCK(PROXY_LOCK, &p->lock);
HA_RWLOCK_WRUNLOCK(PROXY_LOCK, &p->lock); ebis_insert(&p->used_server_addr, &s->addr_node);
HA_RWLOCK_WRUNLOCK(PROXY_LOCK, &p->lock);
}
} }
/* /*