From: William Lallemand Date: Mon, 18 Jul 2022 12:09:58 +0000 (+0200) Subject: MINOR: resolvers: resolvers_destroy() deinit and free a resolver X-Git-Tag: v2.7-dev3~86 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e606c84feea81ed408217ed88a5ce11d6b3f65d4;p=thirdparty%2Fhaproxy.git MINOR: resolvers: resolvers_destroy() deinit and free a resolver Split the resolvers_deinit() function into resolvers_destroy() and resolvers_deinit() in order to be able to free a unique resolvers section. --- diff --git a/src/resolvers.c b/src/resolvers.c index ac6b23dd4b..ce08479317 100644 --- a/src/resolvers.c +++ b/src/resolvers.c @@ -2403,64 +2403,72 @@ static struct task *process_resolvers(struct task *t, void *context, unsigned in return t; } -/* Release memory allocated by DNS */ -static void resolvers_deinit(void) + +/* destroy a resolvers */ +static void resolvers_destroy(struct resolvers *resolvers) { - struct resolvers *resolvers, *resolversback; struct dns_nameserver *ns, *nsback; struct resolv_resolution *res, *resback; struct resolv_requester *req, *reqback; - struct resolv_srvrq *srvrq, *srvrqback; - list_for_each_entry_safe(resolvers, resolversback, &sec_resolvers, list) { - list_for_each_entry_safe(ns, nsback, &resolvers->nameservers, list) { - free(ns->id); - free((char *)ns->conf.file); - if (ns->dgram) { - if (ns->dgram->conn.t.sock.fd != -1) { - fd_delete(ns->dgram->conn.t.sock.fd); - close(ns->dgram->conn.t.sock.fd); - } - if (ns->dgram->ring_req) - ring_free(ns->dgram->ring_req); - free(ns->dgram); - } - if (ns->stream) { - if (ns->stream->ring_req) - ring_free(ns->stream->ring_req); - if (ns->stream->task_req) - task_destroy(ns->stream->task_req); - if (ns->stream->task_rsp) - task_destroy(ns->stream->task_rsp); - free(ns->stream); + list_for_each_entry_safe(ns, nsback, &resolvers->nameservers, list) { + free(ns->id); + free((char *)ns->conf.file); + if (ns->dgram) { + if (ns->dgram->conn.t.sock.fd != -1) { + fd_delete(ns->dgram->conn.t.sock.fd); + close(ns->dgram->conn.t.sock.fd); } - LIST_DEL_INIT(&ns->list); - EXTRA_COUNTERS_FREE(ns->extra_counters); - free(ns); + if (ns->dgram->ring_req) + ring_free(ns->dgram->ring_req); + free(ns->dgram); } + if (ns->stream) { + if (ns->stream->ring_req) + ring_free(ns->stream->ring_req); + if (ns->stream->task_req) + task_destroy(ns->stream->task_req); + if (ns->stream->task_rsp) + task_destroy(ns->stream->task_rsp); + free(ns->stream); + } + LIST_DEL_INIT(&ns->list); + EXTRA_COUNTERS_FREE(ns->extra_counters); + free(ns); + } - list_for_each_entry_safe(res, resback, &resolvers->resolutions.curr, list) { - list_for_each_entry_safe(req, reqback, &res->requesters, list) { - LIST_DEL_INIT(&req->list); - pool_free(resolv_requester_pool, req); - } - resolv_free_resolution(res); + list_for_each_entry_safe(res, resback, &resolvers->resolutions.curr, list) { + list_for_each_entry_safe(req, reqback, &res->requesters, list) { + LIST_DEL_INIT(&req->list); + pool_free(resolv_requester_pool, req); } + resolv_free_resolution(res); + } - list_for_each_entry_safe(res, resback, &resolvers->resolutions.wait, list) { - list_for_each_entry_safe(req, reqback, &res->requesters, list) { - LIST_DEL_INIT(&req->list); - pool_free(resolv_requester_pool, req); - } - resolv_free_resolution(res); + list_for_each_entry_safe(res, resback, &resolvers->resolutions.wait, list) { + list_for_each_entry_safe(req, reqback, &res->requesters, list) { + LIST_DEL_INIT(&req->list); + pool_free(resolv_requester_pool, req); } + resolv_free_resolution(res); + } - free_proxy(resolvers->px); - free(resolvers->id); - free((char *)resolvers->conf.file); - task_destroy(resolvers->t); - LIST_DEL_INIT(&resolvers->list); - free(resolvers); + free_proxy(resolvers->px); + free(resolvers->id); + free((char *)resolvers->conf.file); + task_destroy(resolvers->t); + LIST_DEL_INIT(&resolvers->list); + free(resolvers); +} + +/* Release memory allocated by DNS */ +static void resolvers_deinit(void) +{ + struct resolvers *resolvers, *resolversback; + struct resolv_srvrq *srvrq, *srvrqback; + + list_for_each_entry_safe(resolvers, resolversback, &sec_resolvers, list) { + resolvers_destroy(resolvers); } list_for_each_entry_safe(srvrq, srvrqback, &resolv_srvrq_list, list) {