From d5de3595a6775757861199be6884cc5f230be0be Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 20 Oct 2021 14:07:31 +0200 Subject: [PATCH] MEDIUM: resolvers: remove the last occurrences of the "safe" argument This one was used to indicate whether the callee had to follow particularly safe code path when removing resolutions. Since the code now uses a kill list, this is not needed anymore. (cherry picked from commit 6878f80427aa8befc6662d85caddb8affe799b9c) Signed-off-by: Willy Tarreau (cherry picked from commit 33360872d1c56a1cc283ba79c736a71bcf7ce464) Signed-off-by: Christopher Faulet --- include/haproxy/dns.h | 4 ++-- src/dns.c | 27 +++++++++------------------ src/server.c | 6 +++--- src/stream.c | 2 +- 4 files changed, 15 insertions(+), 24 deletions(-) diff --git a/include/haproxy/dns.h b/include/haproxy/dns.h index ada2a10..1178afe 100644 --- a/include/haproxy/dns.h +++ b/include/haproxy/dns.h @@ -44,8 +44,8 @@ int dns_get_ip_from_response(struct dns_response_packet *dns_p, struct server *owner); int dns_link_resolution(void *requester, int requester_type, int requester_locked); -void dns_unlink_resolution(struct dns_requester *requester, int safe); -void dns_detach_from_resolution_answer_items(struct dns_resolution *res, struct dns_requester *req, int safe); +void dns_unlink_resolution(struct dns_requester *requester); +void dns_detach_from_resolution_answer_items(struct dns_resolution *res, struct dns_requester *req); void dns_trigger_resolution(struct dns_requester *requester); enum act_parse_ret dns_parse_do_resolve(const char **args, int *orig_arg, struct proxy *px, struct act_rule *rule, char **err); int check_action_do_resolve(struct act_rule *rule, struct proxy *px, char **err); diff --git a/src/dns.c b/src/dns.c index 7f45dc9..0fa2733 100644 --- a/src/dns.c +++ b/src/dns.c @@ -61,7 +61,7 @@ static unsigned int resolution_uuid = 1; unsigned int dns_failed_resolutions = 0; static struct task *dns_process_resolvers(struct task *t, void *context, unsigned short state); static void dns_free_resolution(struct dns_resolution *resolution); -static void _dns_unlink_resolution(struct dns_requester *requester, int safe); +static void _dns_unlink_resolution(struct dns_requester *requester); enum { DNS_STAT_ID, @@ -675,7 +675,7 @@ static void free_aborted_resolutions() */ static void dns_srvrq_cleanup_srv(struct server *srv) { - _dns_unlink_resolution(srv->dns_requester, 0); + _dns_unlink_resolution(srv->dns_requester); HA_SPIN_LOCK(SERVER_LOCK, &srv->lock); srvrq_update_srv_status(srv, 1); free(srv->hostname); @@ -876,7 +876,7 @@ srv_found: /* Unlink A/AAAA resolution for this server if there is an AR item. * It is usless to perform an extra resolution */ - _dns_unlink_resolution(srv->dns_requester, 0); + _dns_unlink_resolution(srv->dns_requester); } if (!srv->hostname_dn) { @@ -2090,7 +2090,7 @@ int dns_link_resolution(void *requester, int requester_type, int requester_locke * is called using safe == 1 to make it usable into callbacks. Must be called * with the death_row already initialized via init_aborted_resolutions(). */ -void dns_detach_from_resolution_answer_items(struct dns_resolution *res, struct dns_requester *req, int safe) +void dns_detach_from_resolution_answer_items(struct dns_resolution *res, struct dns_requester *req) { struct dns_answer_item *item, *itemback; struct server *srv, *srvback; @@ -2117,7 +2117,7 @@ void dns_detach_from_resolution_answer_items(struct dns_resolution *res, struct * if is set to 1, the corresponding resolution is not released. Must be * called with the death_row already initialized via init_aborted_resolutions(). */ -void _dns_unlink_resolution(struct dns_requester *requester, int safe) +void _dns_unlink_resolution(struct dns_requester *requester) { struct dns_resolution *res; struct dns_requester *req; @@ -2128,7 +2128,7 @@ void _dns_unlink_resolution(struct dns_requester *requester, int safe) res = requester->resolution; /* remove ref from the resolution answer item list to the requester */ - dns_detach_from_resolution_answer_items(res, requester, safe); + dns_detach_from_resolution_answer_items(res, requester); /* Clean up the requester */ LIST_DEL_INIT(&requester->list); @@ -2138,15 +2138,6 @@ void _dns_unlink_resolution(struct dns_requester *requester, int safe) if (!LIST_ISEMPTY(&res->requesters)) req = LIST_NEXT(&res->requesters, struct dns_requester *, list); else { - if (safe) { - /* Don't release it yet. */ - dns_reset_resolution(res); - res->hostname_dn = NULL; - res->hostname_dn_len = 0; - dns_purge_resolution_answer_records(res); - return; - } - abort_resolution(res); return; } @@ -2173,10 +2164,10 @@ void _dns_unlink_resolution(struct dns_requester *requester, int safe) } /* The public version of the function above that deals with the death row. */ -void dns_unlink_resolution(struct dns_requester *requester, int safe) +void dns_unlink_resolution(struct dns_requester *requester) { init_aborted_resolutions(); - _dns_unlink_resolution(requester, safe); + _dns_unlink_resolution(requester); free_aborted_resolutions(); } @@ -3149,7 +3140,7 @@ enum act_return dns_action_do_resolve(struct act_rule *rule, struct proxy *px, s->dns_ctx.hostname_dn = NULL; s->dns_ctx.hostname_dn_len = 0; if (s->dns_ctx.dns_requester) { - _dns_unlink_resolution(s->dns_ctx.dns_requester, 0); + _dns_unlink_resolution(s->dns_ctx.dns_requester); pool_free(dns_requester_pool, s->dns_ctx.dns_requester); s->dns_ctx.dns_requester = NULL; } diff --git a/src/server.c b/src/server.c index a70c096..62ad7c4 100644 --- a/src/server.c +++ b/src/server.c @@ -4018,7 +4018,7 @@ int srvrq_resolution_error_cb(struct dns_requester *requester, int error_code) } /* Remove any associated server ref */ - dns_detach_from_resolution_answer_items(res, requester, 1); + dns_detach_from_resolution_answer_items(res, requester); return 0; } @@ -4043,7 +4043,7 @@ int snr_resolution_error_cb(struct dns_requester *requester, int error_code) if (!snr_update_srv_status(s, 1)) { memset(&s->addr, 0, sizeof(s->addr)); HA_SPIN_UNLOCK(SERVER_LOCK, &s->lock); - dns_detach_from_resolution_answer_items(requester->resolution, requester, 1); + dns_detach_from_resolution_answer_items(requester->resolution, requester); return 0; } HA_SPIN_UNLOCK(SERVER_LOCK, &s->lock); @@ -4166,7 +4166,7 @@ int srv_set_fqdn(struct server *srv, const char *hostname, int dns_locked) strcasecmp(resolution->hostname_dn, hostname_dn) == 0) goto end; - dns_unlink_resolution(srv->dns_requester, 0); + dns_unlink_resolution(srv->dns_requester); free(srv->hostname); free(srv->hostname_dn); diff --git a/src/stream.c b/src/stream.c index de2760e..33fa512 100644 --- a/src/stream.c +++ b/src/stream.c @@ -634,7 +634,7 @@ static void stream_free(struct stream *s) HA_SPIN_LOCK(DNS_LOCK, &resolvers->lock); free(s->dns_ctx.hostname_dn); s->dns_ctx.hostname_dn = NULL; s->dns_ctx.hostname_dn_len = 0; - dns_unlink_resolution(s->dns_ctx.dns_requester, 0); + dns_unlink_resolution(s->dns_ctx.dns_requester); HA_SPIN_UNLOCK(DNS_LOCK, &resolvers->lock); pool_free(dns_requester_pool, s->dns_ctx.dns_requester); -- 1.7.10.4