]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: resolvers: resolvers_destroy() deinit and free a resolver
authorWilliam Lallemand <wlallemand@haproxy.org>
Mon, 18 Jul 2022 12:09:58 +0000 (14:09 +0200)
committerWilliam Lallemand <wlallemand@haproxy.org>
Mon, 18 Jul 2022 12:39:36 +0000 (14:39 +0200)
Split the resolvers_deinit() function into resolvers_destroy() and
resolvers_deinit() in order to be able to free a unique resolvers
section.

src/resolvers.c

index ac6b23dd4be43a43ffef01bfc6b75d31fcef799a..ce08479317eeb811654e976299bdf616cac638bc 100644 (file)
@@ -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) {