From: Christopher Faulet Date: Wed, 10 Mar 2021 20:33:21 +0000 (+0100) Subject: BUG/MINOR: resolvers: Unlink DNS resolution to set RMAINT on SRV resolution X-Git-Url: http://git.haproxy.org/?a=commitdiff_plain;h=4276d2ce60d0c8aa84575b3899617785aea59123;p=haproxy-2.1.git BUG/MINOR: resolvers: Unlink DNS resolution to set RMAINT on SRV resolution When a server is set in RMAINT becaues of a SRV resolution failure, the server DNS resolution, if any, must be unlink first. It is mandatory to handle the change in the context of a SRV resolution. This patch must be backported as far as 2.2. (cherry picked from commit bca680ba90787fc57b9711e268f6fb0c74e7e49c) Signed-off-by: Christopher Faulet (cherry picked from commit 833937da99caf3639e67a14409095a402ea2f0b2) Signed-off-by: Christopher Faulet (cherry picked from commit f586f823539583c5f637e239a90f6dc0a959b859) [cf: Must be backported as far as 2.0 because of recent changes on resolvers] Signed-off-by: Christopher Faulet --- diff --git a/src/dns.c b/src/dns.c index 367d6fd..a04e137 100644 --- a/src/dns.c +++ b/src/dns.c @@ -519,6 +519,7 @@ static void dns_check_dns_response(struct dns_resolution *res) if (srv->srvrq == srvrq && srv->svc_port == item->port && item->data_len == srv->hostname_dn_len && !dns_hostname_cmp(srv->hostname_dn, item->target, item->data_len)) { + dns_unlink_resolution(srv->dns_requester); snr_update_srv_status(srv, 1); free(srv->hostname); free(srv->hostname_dn); @@ -527,7 +528,6 @@ static void dns_check_dns_response(struct dns_resolution *res) srv->hostname_dn_len = 0; memset(&srv->addr, 0, sizeof(srv->addr)); srv->svc_port = 0; - dns_unlink_resolution(srv->dns_requester); } HA_SPIN_UNLOCK(SERVER_LOCK, &srv->lock); } diff --git a/src/server.c b/src/server.c index eaae723..512fa00 100644 --- a/src/server.c +++ b/src/server.c @@ -4239,6 +4239,7 @@ int srvrq_resolution_error_cb(struct dns_requester *requester, int error_code) for (s = srvrq->proxy->srv; s != NULL; s = s->next) { HA_SPIN_LOCK(SERVER_LOCK, &s->lock); if (s->srvrq == srvrq) { + dns_unlink_resolution(s->dns_requester); snr_update_srv_status(s, 1); free(s->hostname); free(s->hostname_dn); @@ -4247,7 +4248,6 @@ int srvrq_resolution_error_cb(struct dns_requester *requester, int error_code) s->hostname_dn_len = 0; memset(&s->addr, 0, sizeof(s->addr)); s->svc_port = 0; - dns_unlink_resolution(s->dns_requester); } HA_SPIN_UNLOCK(SERVER_LOCK, &s->lock); }